]>
Commit | Line | Data |
---|---|---|
6ab674bd | 1 | #ifndef ALILOG_H |
2 | #define ALILOG_H | |
3 | /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
4 | * See cxx source for full Copyright notice */ | |
5 | ||
6 | /* $Id$ */ | |
7 | ||
5a9a01d4 | 8 | #include <TClass.h> |
6ab674bd | 9 | #include <TObjArray.h> |
5a9a01d4 | 10 | #include <TObject.h> |
6ab674bd | 11 | #include <TString.h> |
12 | ||
840f6973 | 13 | using std::ostream; |
14 | ||
6d7793cf | 15 | // deprecation macro |
16 | #if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) | |
13242232 | 17 | # define ALIROOT_DEPRECATED(func) func __attribute__ ((deprecated)) |
6d7793cf | 18 | #elif defined(_MSC_VER) && _MSC_VER >= 1300 |
13242232 | 19 | # define ALIROOT_DEPRECATED(func) __declspec(deprecated) func |
20 | #else | |
21 | # define ALIROOT_DEPRECATED(func) func | |
6d7793cf | 22 | #endif |
6ab674bd | 23 | |
6d7793cf | 24 | /** |
25 | * class for logging debug, info and error messages | |
26 | */ | |
27 | class AliLog: public TObject | |
28 | { | |
6ab674bd | 29 | public: |
6ab674bd | 30 | |
6d7793cf | 31 | // Log4j log levels: TRACE, DEBUG, INFO, WARN, ERROR, FATAL |
44ce6bbe | 32 | enum EType_t {kFatal = 0, kError, kWarning, kInfo, kDebug, kMaxType}; |
1948744e | 33 | typedef void (*AliLogNotification)(EType_t type, const char* message ); |
34 | ||
6d7793cf | 35 | // NB: singleton constructor & destructor should not be public! |
36 | // ALIROOT_DEPRECATED(AliLog()); | |
37 | // ALIROOT_DEPRECATED(virtual ~AliLog()); | |
38 | ||
39 | // NB: singleton deprecated static instance method | |
40 | // ALIROOT_DEPRECATED(static AliLog* Instance() {return fgInstance;};) | |
41 | ||
42 | // get root logger singleton instance | |
43 | static AliLog *GetRootLogger(); | |
6ab674bd | 44 | |
6d7793cf | 45 | // delete root logger singleton instance |
46 | static void DeleteRootLogger(); | |
47 | ||
48 | // NB: the following functions should not be static | |
49 | // NB: deprecated: logging configuration should be made through to a configuration file | |
6ab674bd | 50 | static void EnableDebug(Bool_t enabled); |
44ce6bbe | 51 | static void SetGlobalLogLevel(EType_t type); |
6ab674bd | 52 | static Int_t GetGlobalLogLevel(); |
53 | static void SetGlobalDebugLevel(Int_t level); | |
54 | static Int_t GetGlobalDebugLevel(); | |
55 | static void SetModuleDebugLevel(const char* module, Int_t level); | |
56 | static void ClearModuleDebugLevel(const char* module); | |
57 | static void SetClassDebugLevel(const char* className, Int_t level); | |
58 | static void ClearClassDebugLevel(const char* className); | |
59 | ||
60 | static void SetStandardOutput(); | |
44ce6bbe | 61 | static void SetStandardOutput(EType_t type); |
6ab674bd | 62 | static void SetErrorOutput(); |
44ce6bbe | 63 | static void SetErrorOutput(EType_t type); |
6ab674bd | 64 | static void SetFileOutput(const char* fileName); |
44ce6bbe | 65 | static void SetFileOutput(EType_t type, const char* fileName); |
1948744e | 66 | static void SetStreamOutput(ostream* stream); |
67 | static void SetStreamOutput(EType_t type, ostream* stream); | |
68 | static void SetLogNotification(AliLogNotification pCallBack); | |
69 | static void SetLogNotification(EType_t type, AliLogNotification pCallBack); | |
6ab674bd | 70 | static void Flush(); |
71 | ||
72 | static void SetHandleRootMessages(Bool_t on); | |
73 | ||
74 | static void SetPrintType(Bool_t on); | |
44ce6bbe | 75 | static void SetPrintType(EType_t type, Bool_t on); |
6ab674bd | 76 | static void SetPrintModule(Bool_t on); |
44ce6bbe | 77 | static void SetPrintModule(EType_t type, Bool_t on); |
6ab674bd | 78 | static void SetPrintScope(Bool_t on); |
44ce6bbe | 79 | static void SetPrintScope(EType_t type, Bool_t on); |
6ab674bd | 80 | static void SetPrintLocation(Bool_t on); |
44ce6bbe | 81 | static void SetPrintLocation(EType_t type, Bool_t on); |
6ab674bd | 82 | |
45fa0297 | 83 | static void SetPrintRepetitions(Bool_t on); |
84 | ||
c4cb6153 | 85 | static void WriteToFile(const char* name, Int_t option = 0); |
6ab674bd | 86 | |
87 | // the following public methods are used by the preprocessor macros | |
88 | // and should not be called directly | |
20848f77 | 89 | static Bool_t IsDebugEnabled() {return fgDebugEnabled;} |
6ab674bd | 90 | static Int_t GetDebugLevel(const char* module, const char* className); |
91 | static void Message(UInt_t level, const char* message, | |
92 | const char* module, const char* className, | |
93 | const char* function, const char* file, Int_t line); | |
94 | static void Debug(UInt_t level, const char* message, | |
95 | const char* module, const char* className, | |
96 | const char* function, const char* file, Int_t line); | |
97 | ||
44ce6bbe | 98 | static Int_t RedirectStdoutTo(EType_t type, UInt_t level, const char* module, |
eeb769e2 | 99 | const char* className, const char* function, |
100 | const char* file, Int_t line, Bool_t print); | |
44ce6bbe | 101 | static Int_t RedirectStderrTo(EType_t type, UInt_t level, const char* module, |
eeb769e2 | 102 | const char* className, const char* function, |
103 | const char* file, Int_t line, Bool_t print); | |
104 | static void RestoreStdout(Int_t original); | |
105 | static void RestoreStderr(Int_t original); | |
106 | ||
44ce6bbe | 107 | static ostream& Stream(EType_t type, UInt_t level, |
eeb769e2 | 108 | const char* module, const char* className, |
109 | const char* function, const char* file, Int_t line); | |
110 | ||
6ab674bd | 111 | private: |
6d7793cf | 112 | |
113 | // constructor is made private for implementing a singleton | |
114 | AliLog(); | |
115 | virtual ~AliLog(); | |
116 | ||
117 | // NOT IMPLEMENTED? | |
6ab674bd | 118 | AliLog(const AliLog& log); |
119 | AliLog& operator = (const AliLog& log); | |
120 | ||
eeb769e2 | 121 | void ReadEnvSettings(); |
122 | ||
6ab674bd | 123 | static void RootErrorHandler(Int_t level, Bool_t abort, |
124 | const char* location, const char* message); | |
125 | ||
126 | void CloseFile(Int_t type); | |
127 | FILE* GetOutputStream(Int_t type); | |
128 | ||
129 | UInt_t GetLogLevel(const char* module, const char* className) const; | |
eeb769e2 | 130 | void PrintMessage(UInt_t type, const char* message, |
131 | const char* module, const char* className, | |
132 | const char* function, | |
133 | const char* file, Int_t line); | |
1948744e | 134 | |
135 | void PrintString(Int_t type, FILE* stream, const char* format, ...); | |
45fa0297 | 136 | void PrintRepetitions(); |
eeb769e2 | 137 | |
44ce6bbe | 138 | Int_t RedirectTo(FILE* stream, EType_t type, UInt_t level, |
eeb769e2 | 139 | const char* module, const char* className, |
140 | const char* function, | |
141 | const char* file, Int_t line, Bool_t print); | |
142 | ||
44ce6bbe | 143 | ostream& GetStream(EType_t type, UInt_t level, |
eeb769e2 | 144 | const char* module, const char* className, |
145 | const char* function, const char* file, Int_t line); | |
6ab674bd | 146 | |
147 | enum {kDebugOffset = kDebug-1}; | |
148 | ||
149 | static AliLog* fgInstance; //! pointer to current instance | |
6ab674bd | 150 | static Bool_t fgDebugEnabled; // flag for debug en-/disabling |
151 | ||
152 | UInt_t fGlobalLogLevel; // global logging level | |
153 | TObjArray fModuleDebugLevels; // debug levels for modules | |
154 | TObjArray fClassDebugLevels; // debug levels for classes | |
155 | ||
156 | Int_t fOutputTypes[kMaxType]; // types of output streams | |
157 | TString fFileNames[kMaxType]; // file names | |
158 | FILE* fOutputFiles[kMaxType]; //! log output files | |
1948744e | 159 | ostream* fOutputStreams[kMaxType]; //! log output streams |
6ab674bd | 160 | |
161 | Bool_t fPrintType[kMaxType]; // print type on/off | |
162 | Bool_t fPrintModule[kMaxType]; // print module on/off | |
163 | Bool_t fPrintScope[kMaxType]; // print scope/class name on/off | |
164 | Bool_t fPrintLocation[kMaxType]; // print file and line on/off | |
165 | ||
45fa0297 | 166 | Bool_t fPrintRepetitions; // print number of repetitions instead of repeated message on/off |
167 | ||
168 | Int_t fRepetitions; //! counter of repetitions | |
169 | UInt_t fLastType; //! type of last message | |
170 | TString fLastMessage; //! last message | |
171 | TString fLastModule; //! module name of last message | |
172 | TString fLastClassName; //! class name of last message | |
173 | TString fLastFunction; //! function name of last message | |
174 | TString fLastFile; //! file name of last message | |
175 | Int_t fLastLine; //! line number of last message | |
1948744e | 176 | AliLogNotification fCallBacks[kMaxType]; //! external notification callback |
45fa0297 | 177 | |
6ab674bd | 178 | ClassDef(AliLog, 1) // class for logging debug, info and error messages |
179 | }; | |
180 | ||
eeb769e2 | 181 | |
6d7793cf | 182 | // module name macro |
eb5bc777 | 183 | #ifdef _MODULE_ |
13242232 | 184 | # define MODULENAME() _MODULE_ |
eeb769e2 | 185 | #else |
13242232 | 186 | # define MODULENAME() "NoModule" |
cd676389 | 187 | #endif |
eeb769e2 | 188 | |
6d7793cf | 189 | // function name macro |
eeb769e2 | 190 | #if defined(__GNUC__) || defined(__ICC) || defined(__ECC) || defined(__APPLE__) |
13242232 | 191 | # define FUNCTIONNAME() __FUNCTION__ |
92154bc0 | 192 | // #elif defined(__HP_aCC) || defined(__alpha) || defined(__DECCXX) |
193 | // #define FUNCTIONNAME() __FUNC__ | |
eeb769e2 | 194 | #else |
13242232 | 195 | # define FUNCTIONNAME() "???" |
cd676389 | 196 | #endif |
6ab674bd | 197 | |
eeb769e2 | 198 | // redirection |
13242232 | 199 | /** |
200 | * Redirect output to std::cout to specified log stream | |
201 | * | |
202 | * @param type Type of stream to re-direct to | |
203 | * @param level Level of output | |
204 | * @param scope Scope | |
205 | * @param whatever Any code that will output to std::cout | |
206 | */ | |
207 | #define REDIRECTSTDOUT(type, level, scope, whatever) \ | |
208 | do {Int_t originalStdout = AliLog::RedirectStdoutTo(type, level, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__, kFALSE); \ | |
209 | whatever; AliLog::RestoreStdout(originalStdout);} while(false) | |
210 | /** | |
211 | * Redirect output to std::cerr to specified log stream | |
212 | * | |
213 | * @param type Type of stream to re-direct to | |
214 | * @param level Level of output | |
215 | * @param scope Scope | |
216 | * @param whatever Any code that will output to std::cout | |
217 | */ | |
218 | #define REDIRECTSTDERR(type, level, scope, whatever) \ | |
219 | do {Int_t originalStderr = AliLog::RedirectStderrTo(type, level, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__, kFALSE); \ | |
220 | whatever; AliLog::RestoreStderr(originalStderr);} while(false) | |
221 | /** | |
222 | * Redirect output to std::cout and std::cerr to specified log stream | |
223 | * | |
224 | * @param type Type of stream to re-direct to | |
225 | * @param level Level of output | |
226 | * @param scope Scope | |
227 | * @param whatever Any code that will output to std::cout or std::cerr | |
228 | */ | |
229 | #define REDIRECTSTDOUTANDSTDERR(type, level, scope, whatever) \ | |
230 | do {Int_t originalStdout = AliLog::RedirectStdoutTo(type, level, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__, kFALSE); \ | |
231 | Int_t originalStderr = AliLog::RedirectStderrTo(type, level, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__, kFALSE); \ | |
232 | whatever; AliLog::RestoreStderr(originalStderr); AliLog::RestoreStdout(originalStdout);} while(false) | |
eeb769e2 | 233 | |
234 | ||
235 | // debug level | |
6ab674bd | 236 | #ifdef LOG_NO_DEBUG |
13242232 | 237 | # define AliDebugLevel() -1 |
238 | # define AliDebugLevelClass() -1 | |
239 | # define AliDebugLevelGeneral(scope) -1 | |
6ab674bd | 240 | #else |
13242232 | 241 | /** |
242 | * Get the object scope debug level | |
243 | */ | |
244 | # define AliDebugLevel() ((AliLog::IsDebugEnabled()) ? AliLog::GetDebugLevel(MODULENAME(), ClassName()) : -1) | |
245 | /** | |
246 | * Get the class (ROOT-enabled) debug level | |
247 | */ | |
248 | # define AliDebugLevelClass() ((AliLog::IsDebugEnabled()) ? AliLog::GetDebugLevel(MODULENAME(), Class()->GetName()) : -1) | |
249 | /** | |
250 | * Get the debug level associated with scope | |
251 | * @param scope Scope | |
252 | */ | |
253 | # define AliDebugLevelGeneral(scope) ((AliLog::IsDebugEnabled()) ? AliLog::GetDebugLevel(MODULENAME(), scope) : -1) | |
6ab674bd | 254 | #endif |
255 | ||
eeb769e2 | 256 | // debug messages |
6ab674bd | 257 | #ifdef LOG_NO_DEBUG |
13242232 | 258 | # define AliDebug(level, message) do { } while (false) |
259 | # define AliDebugClass(level, message) do { } while (false) | |
260 | # define AliDebugGeneral(scope, level, message) do { } while (false) | |
261 | # define AliDebugF(level, message,...) do { } while (false) | |
262 | # define AliDebugClassF(level, message,...) do { } while (false) | |
263 | # define AliDebugGeneralF(scope, level, message,...) do { } while (false) | |
6ab674bd | 264 | #else |
c2deee9d | 265 | |
266 | // inspired by log4cxx code (see log4cxx/Logger.h) | |
267 | // implements GCC branch prediction for increasing logging performance | |
13242232 | 268 | # if !defined(ALIROOT_UNLIKELY) |
269 | # if defined(__GNUC__) && (__GNUC__ >= 3) | |
c2deee9d | 270 | /** |
13242232 | 271 | * Provides optimization hint to the compiler |
272 | * to optimize for the expression being false. | |
273 | * @param expr boolean expression. | |
274 | * @returns value of expression. | |
275 | */ | |
276 | # define ALIROOT_UNLIKELY(expr) __builtin_expect(expr, 0) | |
277 | # else | |
c2deee9d | 278 | /** |
13242232 | 279 | * Provides optimization hint to the compiler |
280 | * to optimize for the expression being false. | |
281 | * @param expr boolean expression. | |
282 | * @returns value of expression. | |
283 | */ | |
284 | # define ALIROOT_UNLIKELY(expr) expr | |
285 | # endif | |
286 | # endif | |
c2deee9d | 287 | |
288 | /** | |
13242232 | 289 | * |
290 | * Logs a message to a specified logger with the DEBUG level. | |
291 | * | |
292 | * @param logLevel the debug level. | |
293 | * @param message message to print in the following format: Form(message). | |
294 | * Note, that message should contain balanced parenthesis, like | |
295 | * <code>AliDebug(1, Form("Failed to decode line %d of %s", line, filename));</code> | |
296 | */ | |
297 | # define AliDebug(logLevel, message) \ | |
c2deee9d | 298 | do { if (ALIROOT_UNLIKELY(AliLog::IsDebugEnabled() && AliLog::GetDebugLevel(MODULENAME(), ClassName()) >= logLevel)) {\ |
299 | AliLog::Debug(logLevel, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__); }} while (0) | |
c2deee9d | 300 | /** |
13242232 | 301 | * |
302 | * Logs a message to a specified logger with the DEBUG level. For use | |
303 | * in static member functions of a class | |
304 | * | |
305 | * @param logLevel the debug level. | |
306 | * @param message message to print in the following format: Form(message). | |
307 | * Note, that message should contain balanced parenthesis, like | |
308 | * <code>AliDebug(1, Form("Failed to decode line %d of %s", line, filename));</code> | |
309 | */ | |
310 | # define AliDebugClass(logLevel, message) \ | |
c2deee9d | 311 | do { if (ALIROOT_UNLIKELY(AliLog::IsDebugEnabled() && AliLog::GetDebugLevel(MODULENAME(), Class()->GetName()) >= logLevel)) {\ |
312 | AliLog::Debug(logLevel, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__); }} while (0) | |
313 | ||
314 | /** | |
13242232 | 315 | * Logs a message to a specified logger with the DEBUG level. For use |
316 | * in non-ROOT-enabled-class scope. | |
317 | * | |
318 | * @param scope the logging scope. | |
319 | * @param logLevel the debug level. | |
320 | * @param message message to print in the following format: Form(message). | |
321 | * Note, that message should contain balanced parenthesis, like | |
322 | * <code>AliDebug(1, Form("Failed to decode line %d of %s", line, filename));</code> | |
c2deee9d | 323 | */ |
13242232 | 324 | # define AliDebugGeneral(scope, logLevel, message) \ |
c2deee9d | 325 | do { if (ALIROOT_UNLIKELY(AliLog::IsDebugEnabled() && AliLog::GetDebugLevel(MODULENAME(), scope) >= logLevel)) {\ |
326 | AliLog::Debug(logLevel, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__); }} while (0) | |
13242232 | 327 | /** |
328 | * Macro to output debugging information. This excepts a printf-like | |
329 | * format statement. Note, at least 3 arguments (in total) must be | |
330 | * passed. | |
331 | * | |
332 | * @param logLevel Debug level | |
333 | * @param format Printf-like format. | |
334 | */ | |
335 | # define AliDebugF(logLevel,format,...) \ | |
336 | do { if (ALIROOT_UNLIKELY(AliLog::IsDebugEnabled() && AliLog::GetDebugLevel(MODULENAME(), ClassName()) >= logLevel)) { \ | |
337 | TString m;m.Form(format,__VA_ARGS__); \ | |
338 | AliLog::Debug(logLevel, m, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__); }} while (0) | |
339 | /** | |
340 | * Outut debug information, filtered on debug level. For use in | |
341 | * static member function of a ROOT-enabled class. This excepts a | |
342 | * printf-like format statement. Note, at least 3 arguments (in | |
343 | * total) must be passed. | |
344 | * | |
345 | * @param logLevel Debug level | |
346 | * @param format Printf-like format | |
347 | * | |
348 | * @return | |
349 | */ | |
350 | # define AliDebugClassF(logLevel,format,...) \ | |
351 | do { if (ALIROOT_UNLIKELY(AliLog::IsDebugEnabled() && AliLog::GetDebugLevel(MODULENAME(), Class()->GetName()) >= logLevel)) { \ | |
352 | TString m;m.Form(format,__VA_ARGS__); \ | |
353 | AliLog::Debug(logLevel, m, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__); }} while (0) | |
354 | /** | |
355 | * Outut debug information, filtered on debug level. For use in | |
356 | * static member function of a non-ROOT-enabled class-scope. This | |
357 | * excepts a printf-like format statement. Note, at least 3 arguments | |
358 | * (in total) must be passed. | |
359 | * | |
360 | * @param scope Scope | |
361 | * @param logLevel Debug level | |
362 | * @param format Printf-like format | |
363 | * | |
364 | * @return | |
365 | */ | |
366 | # define AliDebugGeneralF(scope,logLevel,format,...) \ | |
367 | do { if (ALIROOT_UNLIKELY(AliLog::IsDebugEnabled() && AliLog::GetDebugLevel(MODULENAME(), scope) >= logLevel)) { \ | |
368 | TString m;m.Form(format,__VA_ARGS__); \ | |
369 | AliLog::Debug(logLevel, m, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__); }} while (0) | |
370 | ||
6ab674bd | 371 | #endif |
372 | ||
eeb769e2 | 373 | // redirection to debug |
374 | #define StdoutToAliDebug(level, whatever) REDIRECTSTDOUT(AliLog::kDebug, level, ClassName(), whatever) | |
375 | #define StderrToAliDebug(level, whatever) REDIRECTSTDERR(AliLog::kDebug, level, ClassName(), whatever) | |
376 | #define ToAliDebug(level, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kDebug, level, ClassName(), whatever) | |
377 | #define StdoutToAliDebugClass(level, whatever) REDIRECTSTDOUT(AliLog::kDebug, level, Class()->GetName(), whatever) | |
378 | #define StderrToAliDebugClass(level, whatever) REDIRECTSTDERR(AliLog::kDebug, level, Class()->GetName(), whatever) | |
379 | #define ToAliDebugClass(level, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kDebug, level, Class()->GetName(), whatever) | |
380 | #define StdoutToAliDebugGeneral(scope, level, whatever) REDIRECTSTDOUT(AliLog::kDebug, level, scope, whatever) | |
381 | #define StderrToAliDebugGeneral(scope, level, whatever) REDIRECTSTDERR(AliLog::kDebug, level, scope, whatever) | |
382 | #define ToAliDebugGeneral(scope, level, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kDebug, level, scope, whatever) | |
383 | ||
384 | // debug stream objects | |
385 | #define AliDebugStream(level) AliLog::Stream(AliLog::kDebug, level, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__) | |
386 | #define AliDebugClassStream(level) AliLog::Stream(AliLog::kDebug, level, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__) | |
387 | #define AliDebugGeneralStream(scope, level) AliLog::Stream(AliLog::kDebug, level, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__) | |
388 | ||
389 | ||
13242232 | 390 | /** |
391 | * Macro that will output stuff using the logging facilities. | |
392 | * | |
393 | * @param lvl Message level | |
394 | * @param message Message to show | |
395 | */ | |
396 | #define AliMessage(lvl,message) do { \ | |
397 | AliLog::Message(lvl, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);} while(false) | |
398 | /** | |
399 | * Macro that will output stuff using the logging facilities. | |
400 | * For use in static member function of ROOT-enabled class-scope. | |
401 | * | |
402 | * @param lvl Message level | |
403 | * @param message Message to show | |
404 | */ | |
405 | #define AliMessageClass(lvl,message) do { \ | |
406 | AliLog::Message(lvl, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);} while(false) | |
407 | /** | |
408 | * Macro that will output stuff using the logging facilities. | |
409 | * For use in non-ROOT-enabled class-scope. | |
410 | * | |
411 | * @param scope Scope | |
412 | * @param lvl Message level | |
413 | * @param message Message to show | |
414 | */ | |
415 | #define AliMessageGeneral(scope,lvl,message) do { \ | |
416 | AliLog::Message(lvl, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);} while(false) | |
417 | /** | |
418 | * Print a message using the AliLog logging facility. This macro | |
419 | * accepts printf-like format arguments. Note, at least 3 arguments | |
420 | * must be passed. | |
421 | * @code | |
422 | * AliMessageF(1, "foo"); // <-- Failes | |
423 | * AliMessageF(1, "foo %d", 42); // <-- OK | |
424 | * @endcode | |
425 | * | |
426 | * @param lvl Message level | |
427 | * @param format printf-like format | |
428 | */ | |
429 | #define AliMessageF(lvl,format,...) do { \ | |
430 | TString m; m.Form(format,__VA_ARGS__); \ | |
431 | AliLog::Message(lvl, m, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);} while(false) | |
432 | /** | |
433 | * Print a message using the AliLog logging facility. This macro | |
434 | * accepts printf-like format arguments. Note, at least 3 arguments | |
435 | * must be passed. | |
436 | * @code | |
437 | * AliMessageF(1, "foo"); // <-- Failes | |
438 | * AliMessageF(1, "foo %d", 42); // <-- OK | |
439 | * @endcode | |
440 | * | |
441 | * This is for static member function in for ROOT-enabled class-scope | |
442 | * | |
443 | * @param lvl Message level | |
444 | * @param format printf-like format | |
445 | */ | |
446 | #define AliMessageClassF(lvl,format,...) do { \ | |
447 | TString m; m.Form(format,__VA_ARGS__); \ | |
448 | AliLog::Message(lvl, m, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);} while(false) | |
449 | /** | |
450 | * Print a message using the AliLog logging facility. This macro | |
451 | * accepts printf-like format arguments. Note, at least 3 arguments | |
452 | * must be passed. | |
453 | * @code | |
454 | * AliMessageF(1, "foo"); // <-- Failes | |
455 | * AliMessageF(1, "foo %d", 42); // <-- OK | |
456 | * @endcode | |
457 | * | |
458 | * This is for non-ROOT-enabled class-scope | |
459 | * | |
460 | * @param scope Scope | |
461 | * @param lvl Message level | |
462 | * @param format printf-like format | |
463 | */ | |
464 | #define AliMessageGeneralF(scope,lvl,format,...) do { \ | |
465 | TString m; m.Form(format,__VA_ARGS__); \ | |
466 | AliLog::Message(lvl, m, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);} while(false) | |
467 | ||
eeb769e2 | 468 | // info messages |
6ab674bd | 469 | #ifdef LOG_NO_INFO |
13242232 | 470 | # define AliInfo(message) do { } while (false) |
471 | # define AliInfoClass(message) do { } while (false) | |
472 | # define AliInfoGeneral(scope, message) do { } while (false) | |
473 | # define AliInfoF(message,...) do { } while (false) | |
474 | # define AliInfoClassF(message,...) do { } while (false) | |
475 | # define AliInfoGeneralF(scope, message,...) do { } while (false) | |
6ab674bd | 476 | #else |
13242232 | 477 | /** |
478 | * Forwards to AliMessage with log level of AliLog::kInfo | |
479 | * @see AliMessage | |
480 | */ | |
481 | # define AliInfo(message) AliMessage(AliLog::kInfo, message) | |
482 | /** | |
483 | * Forwards to AliMessageClass with log level of AliLog::kInfo | |
484 | * @see AliMessageClass | |
485 | */ | |
486 | # define AliInfoClass(message) AliMessageClass(AliLog::kInfo, message) | |
487 | /** | |
488 | * Forwards to AliMessageGeneral with log level of AliLog::kInfo | |
489 | * @see AliMessageGeneral | |
490 | */ | |
491 | # define AliInfoGeneral(scope, message) AliMessageGeneral(scope, AliLog::kInfo, message) | |
492 | /** | |
493 | * Forwards to AliMessageF with log level of AliLog::kInfo | |
494 | * @see AliMessageF | |
495 | */ | |
496 | # define AliInfoF(message,...) AliMessageF(AliLog::kInfo, message, __VA_ARGS__) | |
497 | /** | |
498 | * Forwards to AliMessageClassF with log level of AliLog::kInfo | |
499 | * @see AliMessageClassF | |
500 | */ | |
501 | # define AliInfoClassF(message,...) AliMessageClassF(AliLog::kInfo, message, __VA_ARGS__) | |
502 | /** | |
503 | * Forwards to AliMessageGeneralF with log level of AliLog::kInfo | |
504 | * @see AliMessageGeneralF | |
505 | */ | |
506 | # define AliInfoGeneralF(scope,message,...) AliMessageGeneralF(scope, AliLog::kInfo, message, __VA_ARGS__) | |
6ab674bd | 507 | #endif |
508 | ||
eeb769e2 | 509 | // redirection to info |
510 | #define StdoutToAliInfo(whatever) REDIRECTSTDOUT(AliLog::kInfo, 0, ClassName(), whatever) | |
511 | #define StderrToAliInfo(whatever) REDIRECTSTDERR(AliLog::kInfo, 0, ClassName(), whatever) | |
512 | #define ToAliInfo(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kInfo, 0, ClassName(), whatever) | |
513 | #define StdoutToAliInfoClass(whatever) REDIRECTSTDOUT(AliLog::kInfo, 0, Class()->GetName(), whatever) | |
514 | #define StderrToAliInfoClass(whatever) REDIRECTSTDERR(AliLog::kInfo, 0, Class()->GetName(), whatever) | |
515 | #define ToAliInfoClass(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kInfo, 0, Class()->GetName(), whatever) | |
516 | #define StdoutToAliInfoGeneral(scope, whatever) REDIRECTSTDOUT(AliLog::kInfo, 0, scope, whatever) | |
517 | #define StderrToAliInfoGeneral(scope, whatever) REDIRECTSTDERR(AliLog::kInfo, 0, scope, whatever) | |
518 | #define ToAliInfoGeneral(scope, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kInfo, 0, scope, whatever) | |
519 | ||
520 | // info stream objects | |
521 | #define AliInfoStream() AliLog::Stream(AliLog::kInfo, 0, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__) | |
522 | #define AliInfoClassStream() AliLog::Stream(AliLog::kInfo, 0, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__) | |
523 | #define AliInfoGeneralStream(scope) AliLog::Stream(AliLog::kInfo, 0, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__) | |
524 | ||
eeb769e2 | 525 | // warning messages |
6ab674bd | 526 | #ifdef LOG_NO_WARNING |
13242232 | 527 | # define AliWarning(message) do { } while (false) |
528 | # define AliWarningClass(message) do { } while (false) | |
529 | # define AliWarningGeneral(scope, message) do { } while (false) | |
530 | # define AliWarningF(message,...) do { } while (false) | |
531 | # define AliWarningClassF(message,...) do { } while (false) | |
532 | # define AliWarningGeneralF(scope, message,...) do { } while (false) | |
6ab674bd | 533 | #else |
13242232 | 534 | /** |
535 | * Forwards to AliMessage with log level of AliLog::kWarning | |
536 | * @see AliMessage | |
537 | */ | |
538 | # define AliWarning(message) AliMessage(AliLog::kWarning, message) | |
539 | /** | |
540 | * Forwards to AliMessageClass with log level of AliLog::kWarning | |
541 | * @see AliMessageClass | |
542 | */ | |
543 | # define AliWarningClass(message) AliMessageClass(AliLog::kWarning, message) | |
544 | /** | |
545 | * Forwards to AliMessageGeneral with log level of AliLog::kWarning | |
546 | * @see AliMessageGeneral | |
547 | */ | |
548 | # define AliWarningGeneral(scope, message) AliMessageGeneral(scope, AliLog::kWarning, message) | |
549 | /** | |
550 | * Forwards to AliMessageF with log level of AliLog::kWarning | |
551 | * @see AliMessageF | |
552 | */ | |
553 | # define AliWarningF(message,...) AliMessageF(AliLog::kWarning, message, __VA_ARGS__) | |
554 | /** | |
555 | * Forwards to AliMessageClassF with log level of AliLog::kWarning | |
556 | * @see AliMessageClassF | |
557 | */ | |
558 | # define AliWarningClassF(message,...) AliMessageClassF(AliLog::kWarning, message, __VA_ARGS__) | |
559 | /** | |
560 | * Forwards to AliMessageGeneralF with log level of AliLog::kWarning | |
561 | * @see AliMessageGeneralF | |
562 | */ | |
563 | # define AliWarningGeneralF(scope,message,...) AliMessageGeneralF(scope, AliLog::kWarning, message, __VA_ARGS__) | |
6ab674bd | 564 | #endif |
565 | ||
eeb769e2 | 566 | // redirection to warning |
567 | #define StdoutToAliWarning(whatever) REDIRECTSTDOUT(AliLog::kWarning, 0, ClassName(), whatever) | |
568 | #define StderrToAliWarning(whatever) REDIRECTSTDERR(AliLog::kWarning, 0, ClassName(), whatever) | |
569 | #define ToAliWarning(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kWarning, 0, ClassName(), whatever) | |
570 | #define StdoutToAliWarningClass(whatever) REDIRECTSTDOUT(AliLog::kWarning, 0, Class()->GetName(), whatever) | |
571 | #define StderrToAliWarningClass(whatever) REDIRECTSTDERR(AliLog::kWarning, 0, Class()->GetName(), whatever) | |
572 | #define ToAliWarningClass(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kWarning, 0, Class()->GetName(), whatever) | |
573 | #define StdoutToAliWarningGeneral(scope, whatever) REDIRECTSTDOUT(AliLog::kWarning, 0, scope, whatever) | |
574 | #define StderrToAliWarningGeneral(scope, whatever) REDIRECTSTDERR(AliLog::kWarning, 0, scope, whatever) | |
575 | #define ToAliWarningGeneral(scope, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kWarning, 0, scope, whatever) | |
576 | ||
577 | // warning stream objects | |
578 | #define AliWarningStream() AliLog::Stream(AliLog::kWarning, 0, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__) | |
579 | #define AliWarningClassStream() AliLog::Stream(AliLog::kWarning, 0, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__) | |
580 | #define AliWarningGeneralStream(scope) AliLog::Stream(AliLog::kWarning, 0, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__) | |
581 | ||
582 | ||
583 | // error messages | |
13242232 | 584 | /** |
585 | * Forwards to AliMessage with log level of AliLog::kError | |
586 | * @see AliMessage | |
587 | */ | |
588 | #define AliError(message) AliMessage(AliLog::kError, message) | |
589 | /** | |
590 | * Forwards to AliMessageClass with log level of AliLog::kError | |
591 | * @see AliMessageClass | |
592 | */ | |
593 | #define AliErrorClass(message) AliMessageClass(AliLog::kError, message) | |
594 | /** | |
595 | * Forwards to AliMessageGeneral with log level of AliLog::kError | |
596 | * @see AliMessageGeneral | |
597 | */ | |
598 | #define AliErrorGeneral(scope, message) AliMessageGeneral(scope, AliLog::kError, message) | |
599 | /** | |
600 | * Forwards to AliMessageF with log level of AliLog::kError | |
601 | * @see AliMessageF | |
602 | */ | |
603 | #define AliErrorF(message,...) AliMessageF(AliLog::kError, message, __VA_ARGS__) | |
604 | /** | |
605 | * Forwards to AliMessageClassF with log level of AliLog::kError | |
606 | * @see AliMessageClassF | |
607 | */ | |
608 | #define AliErrorClassF(message,...) AliMessageClassF(AliLog::kError, message, __VA_ARGS__) | |
609 | /** | |
610 | * Forwards to AliMessageGeneralF with log level of AliLog::kError | |
611 | * @see AliMessageGeneralF | |
612 | */ | |
613 | #define AliErrorGeneralF(scope,message,...) AliMessageGeneralF(scope, AliLog::kError, message, __VA_ARGS__) | |
eeb769e2 | 614 | |
615 | // redirection to error | |
616 | #define StdoutToAliError(whatever) REDIRECTSTDOUT(AliLog::kError, 0, ClassName(), whatever) | |
617 | #define StderrToAliError(whatever) REDIRECTSTDERR(AliLog::kError, 0, ClassName(), whatever) | |
618 | #define ToAliError(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kError, 0, ClassName(), whatever) | |
619 | #define StdoutToAliErrorClass(whatever) REDIRECTSTDOUT(AliLog::kError, 0, Class()->GetName(), whatever) | |
620 | #define StderrToAliErrorClass(whatever) REDIRECTSTDERR(AliLog::kError, 0, Class()->GetName(), whatever) | |
621 | #define ToAliErrorClass(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kError, 0, Class()->GetName(), whatever) | |
622 | #define StdoutToAliErrorGeneral(scope, whatever) REDIRECTSTDOUT(AliLog::kError, 0, scope, whatever) | |
623 | #define StderrToAliErrorGeneral(scope, whatever) REDIRECTSTDERR(AliLog::kError, 0, scope, whatever) | |
624 | #define ToAliErrorGeneral(scope, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kError, 0, scope, whatever) | |
625 | ||
626 | // error stream objects | |
627 | #define AliErrorStream() AliLog::Stream(AliLog::kError, 0, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__) | |
628 | #define AliErrorClassStream() AliLog::Stream(AliLog::kError, 0, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__) | |
629 | #define AliErrorGeneralStream(scope) AliLog::Stream(AliLog::kError, 0, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__) | |
630 | ||
6ab674bd | 631 | |
eeb769e2 | 632 | // fatal messages |
13242232 | 633 | /** |
634 | * Forwards to AliMessage with log level of AliLog::kFatal | |
635 | * @see AliMessage | |
636 | */ | |
637 | #define AliFatal(message) AliMessage(AliLog::kFatal, message) | |
638 | /** | |
639 | * Forwards to AliMessageClass with log level of AliLog::kFatal | |
640 | * @see AliMessageClass | |
641 | */ | |
642 | #define AliFatalClass(message) AliMessageClass(AliLog::kFatal, message) | |
643 | /** | |
644 | * Forwards to AliMessageGeneral with log level of AliLog::kFatal | |
645 | * @see AliMessageGeneral | |
646 | */ | |
647 | #define AliFatalGeneral(scope, message) AliMessageGeneral(scope, AliLog::kFatal, message) | |
648 | /** | |
649 | * Forwards to AliMessageF with log level of AliLog::kFatal | |
650 | * @see AliMessageF | |
651 | */ | |
652 | #define AliFatalF(message,...) AliMessageF(AliLog::kFatal, message, __VA_ARGS__) | |
653 | /** | |
654 | * Forwards to AliMessageClassF with log level of AliLog::kFatal | |
655 | * @see AliMessageClassF | |
656 | */ | |
657 | #define AliFatalClassF(message,...) AliMessageClassF(AliLog::kFatal, message, __VA_ARGS__) | |
658 | /** | |
659 | * Forwards to AliMessageGeneralF with log level of AliLog::kFatal | |
660 | * @see AliMessageGeneralF | |
661 | */ | |
662 | #define AliFatalGeneralF(scope,message,...) AliMessageGeneralF(scope, AliLog::kFatal, message, __VA_ARGS__) | |
6ab674bd | 663 | |
664 | #endif |