new class for message logging
[u/mrichter/AliRoot.git] / STEER / AliLog.h
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 ///
9 /// class for logging debug, info and error messages
10 ///
11
12 #include <TObject.h>
13 #include <TObjArray.h>
14 #include <TString.h>
15
16
17 class AliLog: public TObject {
18  public:
19   AliLog();
20   virtual ~AliLog();
21   static AliLog* Instance() {return fgInstance;}
22
23   enum EType {kFatal = 0, kError, kWarning, kInfo, kDebug, kMaxType};
24
25   static void  EnableDebug(Bool_t enabled);
26   static void  SetGlobalLogLevel(EType type);
27   static Int_t GetGlobalLogLevel();
28   static void  SetGlobalDebugLevel(Int_t level);
29   static Int_t GetGlobalDebugLevel();
30   static void  SetModuleDebugLevel(const char* module, Int_t level);
31   static void  ClearModuleDebugLevel(const char* module);
32   static void  SetClassDebugLevel(const char* className, Int_t level);
33   static void  ClearClassDebugLevel(const char* className);
34
35   static void  SetStandardOutput();
36   static void  SetStandardOutput(EType type);
37   static void  SetErrorOutput();
38   static void  SetErrorOutput(EType type);
39   static void  SetFileOutput(const char* fileName);
40   static void  SetFileOutput(EType type, const char* fileName);
41   static void  Flush();
42
43   static void  SetHandleRootMessages(Bool_t on);
44
45   static void  SetPrintType(Bool_t on);
46   static void  SetPrintType(EType type, Bool_t on);
47   static void  SetPrintModule(Bool_t on);
48   static void  SetPrintModule(EType type, Bool_t on);
49   static void  SetPrintScope(Bool_t on);
50   static void  SetPrintScope(EType type, Bool_t on);
51   static void  SetPrintLocation(Bool_t on);
52   static void  SetPrintLocation(EType type, Bool_t on);
53
54   static void  Write(const char* name, Int_t option = 0);
55
56   // the following public methods are used by the preprocessor macros 
57   // and should not be called directly
58   static Int_t GetDebugLevel(const char* module, const char* className);
59   static void  Message(UInt_t level, const char* message, 
60                        const char* module, const char* className,
61                        const char* function, const char* file, Int_t line);
62   static void  Debug(UInt_t level, const char* message, 
63                      const char* module, const char* className,
64                      const char* function, const char* file, Int_t line);
65
66  private:
67   AliLog(const AliLog& log);
68   AliLog& operator = (const AliLog& log);
69
70   static void    RootErrorHandler(Int_t level, Bool_t abort, 
71                                   const char* location, const char* message);
72
73   void           CloseFile(Int_t type);
74   FILE*          GetOutputStream(Int_t type);
75
76   UInt_t         GetLogLevel(const char* module, const char* className) const;
77
78   enum {kDebugOffset = kDebug-1};
79
80   static AliLog* fgInstance;                 //! pointer to current instance
81
82   static Bool_t  fgDebugEnabled;             // flag for debug en-/disabling
83
84   UInt_t         fGlobalLogLevel;            // global logging level
85   TObjArray      fModuleDebugLevels;         // debug levels for modules
86   TObjArray      fClassDebugLevels;          // debug levels for classes
87
88   Int_t          fOutputTypes[kMaxType];     // types of output streams
89   TString        fFileNames[kMaxType];       // file names
90   FILE*          fOutputFiles[kMaxType];     //! log output files
91
92   Bool_t         fPrintType[kMaxType];       // print type on/off
93   Bool_t         fPrintModule[kMaxType];     // print module on/off
94   Bool_t         fPrintScope[kMaxType];      // print scope/class name on/off
95   Bool_t         fPrintLocation[kMaxType];   // print file and line on/off
96
97   ClassDef(AliLog, 1)   // class for logging debug, info and error messages
98 };
99
100
101 #ifdef LOG_NO_DEBUG
102 #define AliDebugLevel() -1
103 #define AliDebugLevelClass() -1
104 #define AliDebugLevelGeneral(scope) -1
105 #else
106 #define AliDebugLevel() ((fgDebugEnabled) ? AliLog::GetDebugLevel(__MODULE__, ClassName()) : -1)
107 #define AliDebugLevelClass() ((fgDebugEnabled) ? AliLog::GetDebugLevel(__MODULE__, Class()->GetName()) : -1)
108 #define AliDebugLevelGeneral(scope) ((fgDebugEnabled) ? AliLog::GetDebugLevel(__MODULE__, scope) : -1)
109 #endif
110
111 #ifdef LOG_NO_DEBUG
112 #define AliDebug(level, message)
113 #define AliDebugClass(level, message)
114 #define AliDebugGeneral(scope, level, message)
115 #else
116 #define AliDebug(level, message) {if (fgDebugEnabled) AliLog::Debug(level, message, __MODULE__, ClassName(), __FUNCTION__, __FILE__, __LINE__);}
117 #define AliDebugClass(level, message) {if (fgDebugEnabled) AliLog::Debug(level, message, __MODULE__, Class()->GetName(), __FUNCTION__, __FILE__, __LINE__);}
118 #define AliDebugGeneral(scope, level, message) {if (fgDebugEnabled) AliLog::Debug(level, message, __MODULE__, scope, __FUNCTION__, __FILE__, __LINE__);}
119 #endif
120
121 #ifdef LOG_NO_INFO
122 #define AliInfo(message)
123 #define AliInfoClass(message)
124 #define AliInfoGeneral(scope, message)
125 #else
126 #define AliInfo(message) {AliLog::Message(AliLog::kInfo, message, __MODULE__, ClassName(), __FUNCTION__, __FILE__, __LINE__);}
127 #define AliInfoClass(message) {AliLog::Message(AliLog::kInfo, message, __MODULE__, Class()->GetName(), __FUNCTION__, __FILE__, __LINE__);}
128 #define AliInfoGeneral(scope, message) {AliLog::Message(AliLog::kInfo, message, __MODULE__, scope, __FUNCTION__, __FILE__, __LINE__);}
129 #endif
130
131 #ifdef LOG_NO_WARNING
132 #define AliWarning(message)
133 #define AliWarningClass(message)
134 #define AliWarningGeneral(scope, message)
135 #else
136 #define AliWarning(message) {AliLog::Message(AliLog::kWarning, message, __MODULE__, ClassName(), __FUNCTION__, __FILE__, __LINE__);}
137 #define AliWarningClass(message) {AliLog::Message(AliLog::kWarning, message, __MODULE__, Class()->GetName(), __FUNCTION__, __FILE__, __LINE__);}
138 #define AliWarningGeneral(scope, message) {AliLog::Message(AliLog::kWarning, message, __MODULE__, scope, __FUNCTION__, __FILE__, __LINE__);}
139 #endif
140
141 #define AliError(message) {AliLog::Message(AliLog::kError, message, __MODULE__, ClassName(), __FUNCTION__, __FILE__, __LINE__);}
142 #define AliErrorClass(message) {AliLog::Message(AliLog::kError, message, __MODULE__, Class()->GetName(), __FUNCTION__, __FILE__, __LINE__);}
143 #define AliErrorGeneral(scope, message) {AliLog::Message(AliLog::kError, message, __MODULE__, scope, __FUNCTION__, __FILE__, __LINE__);}
144
145 #define AliFatal(message) {AliLog::Message(AliLog::kFatal, message, __MODULE__, ClassName(), __FUNCTION__, __FILE__, __LINE__);}
146 #define AliFatalClass(message) {AliLog::Message(AliLog::kFatal, message, __MODULE__, Class()->GetName(), __FUNCTION__, __FILE__, __LINE__);}
147 #define AliFatalGeneral(scope, message) {AliLog::Message(AliLog::kFatal, message, __MODULE__, scope, __FUNCTION__, __FILE__, __LINE__);}
148
149 #endif