LCOV - code coverage report
Current view: top level - STEER/STEERBase - AliLog.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 2 2 100.0 %
Date: 2016-06-14 17:26:59 Functions: 2 6 33.3 %

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

Generated by: LCOV version 1.11