a68f40b79282a54981c893376c8aa6d07318c943
[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 Bool_t IsDebugEnabled() {return fgDebugEnabled;}
59   static Int_t GetDebugLevel(const char* module, const char* className);
60   static void  Message(UInt_t level, const char* message, 
61                        const char* module, const char* className,
62                        const char* function, const char* file, Int_t line);
63   static void  Debug(UInt_t level, const char* message, 
64                      const char* module, const char* className,
65                      const char* function, const char* file, Int_t line);
66
67   static Int_t RedirectStdoutTo(EType type, UInt_t level, const char* module, 
68                                 const char* className, const char* function,
69                                 const char* file, Int_t line, Bool_t print);
70   static Int_t RedirectStderrTo(EType type, UInt_t level, const char* module, 
71                                 const char* className, const char* function,
72                                 const char* file, Int_t line, Bool_t print);
73   static void  RestoreStdout(Int_t original);
74   static void  RestoreStderr(Int_t original);
75
76   static ostream& Stream(EType type, UInt_t level,
77                          const char* module, const char* className,
78                          const char* function, const char* file, Int_t line);
79
80  private:
81   AliLog(const AliLog& log);
82   AliLog& operator = (const AliLog& log);
83
84   void           ReadEnvSettings();
85
86   static void    RootErrorHandler(Int_t level, Bool_t abort, 
87                                   const char* location, const char* message);
88
89   void           CloseFile(Int_t type);
90   FILE*          GetOutputStream(Int_t type);
91
92   UInt_t         GetLogLevel(const char* module, const char* className) const;
93   void           PrintMessage(UInt_t type, const char* message, 
94                               const char* module, const char* className,
95                               const char* function, 
96                               const char* file, Int_t line);
97
98   Int_t          RedirectTo(FILE* stream, EType type, UInt_t level,
99                             const char* module, const char* className,
100                             const char* function,
101                             const char* file, Int_t line, Bool_t print);
102
103   ostream&       GetStream(EType type, UInt_t level,
104                            const char* module, const char* className,
105                            const char* function, const char* file, Int_t line);
106
107   enum {kDebugOffset = kDebug-1};
108
109   static AliLog* fgInstance;                 //! pointer to current instance
110
111   static Bool_t  fgDebugEnabled;             // flag for debug en-/disabling
112
113   UInt_t         fGlobalLogLevel;            // global logging level
114   TObjArray      fModuleDebugLevels;         // debug levels for modules
115   TObjArray      fClassDebugLevels;          // debug levels for classes
116
117   Int_t          fOutputTypes[kMaxType];     // types of output streams
118   TString        fFileNames[kMaxType];       // file names
119   FILE*          fOutputFiles[kMaxType];     //! log output files
120   ofstream*      fOutputStreams[kMaxType];   //! log output streams
121
122   Bool_t         fPrintType[kMaxType];       // print type on/off
123   Bool_t         fPrintModule[kMaxType];     // print module on/off
124   Bool_t         fPrintScope[kMaxType];      // print scope/class name on/off
125   Bool_t         fPrintLocation[kMaxType];   // print file and line on/off
126
127   ClassDef(AliLog, 1)   // class for logging debug, info and error messages
128 };
129
130
131 // module name
132 #ifdef __MODULE__
133 #define MODULENAME() __MODULE__
134 #else
135 #define MODULENAME() "NoModule"
136 #endif
137
138 // function name
139 #if defined(__GNUC__) || defined(__ICC) || defined(__ECC) || defined(__APPLE__)
140 #define FUNCTIONNAME() __FUNCTION__
141 #elif defined(__HP_aCC) || defined(__alpha) || defined(__DECCXX)
142 #define FUNCTIONNAME() __FUNC__
143 #else
144 #define FUNCTIONNAME() "???"
145 #endif
146
147 // redirection
148 #define REDIRECTSTDOUT(type, level, scope, whatever) {Int_t originalStdout = AliLog::RedirectStdoutTo(type, level, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__, kFALSE); whatever; AliLog::RestoreStdout(originalStdout);}
149 #define REDIRECTSTDERR(type, level, scope, whatever) {Int_t originalStderr = AliLog::RedirectStderrTo(type, level, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__, kFALSE); whatever; AliLog::RestoreStderr(originalStderr);}
150 #define REDIRECTSTDOUTANDSTDERR(type, level, scope, whatever) {Int_t originalStdout = AliLog::RedirectStdoutTo(type, level, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__, kFALSE); Int_t originalStderr = AliLog::RedirectStderrTo(type, level, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__, kFALSE); whatever; AliLog::RestoreStderr(originalStderr); AliLog::RestoreStdout(originalStdout);}
151
152
153 // debug level
154 #ifdef LOG_NO_DEBUG
155 #define AliDebugLevel() -1
156 #define AliDebugLevelClass() -1
157 #define AliDebugLevelGeneral(scope) -1
158 #else
159 #define AliDebugLevel() ((AliLog::IsDebugEnabled()) ? AliLog::GetDebugLevel(MODULENAME(), ClassName()) : -1)
160 #define AliDebugLevelClass() ((AliLog::IsDebugEnabled()) ? AliLog::GetDebugLevel(MODULENAME(), Class()->GetName()) : -1)
161 #define AliDebugLevelGeneral(scope) ((AliLog::IsDebugEnabled()) ? AliLog::GetDebugLevel(MODULENAME(), scope) : -1)
162 #endif
163
164 // debug messages
165 #ifdef LOG_NO_DEBUG
166 #define AliDebug(level, message)
167 #define AliDebugClass(level, message)
168 #define AliDebugGeneral(scope, level, message)
169 #else
170 #define AliDebug(level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);}
171 #define AliDebugClass(level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);}
172 #define AliDebugGeneral(scope, level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);}
173 #endif
174
175 // redirection to debug
176 #define StdoutToAliDebug(level, whatever) REDIRECTSTDOUT(AliLog::kDebug, level, ClassName(), whatever)
177 #define StderrToAliDebug(level, whatever) REDIRECTSTDERR(AliLog::kDebug, level, ClassName(), whatever)
178 #define ToAliDebug(level, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kDebug, level, ClassName(), whatever)
179 #define StdoutToAliDebugClass(level, whatever) REDIRECTSTDOUT(AliLog::kDebug, level, Class()->GetName(), whatever)
180 #define StderrToAliDebugClass(level, whatever) REDIRECTSTDERR(AliLog::kDebug, level, Class()->GetName(), whatever)
181 #define ToAliDebugClass(level, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kDebug, level, Class()->GetName(), whatever)
182 #define StdoutToAliDebugGeneral(scope, level, whatever) REDIRECTSTDOUT(AliLog::kDebug, level, scope, whatever)
183 #define StderrToAliDebugGeneral(scope, level, whatever) REDIRECTSTDERR(AliLog::kDebug, level, scope, whatever)
184 #define ToAliDebugGeneral(scope, level, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kDebug, level, scope, whatever)
185
186 // debug stream objects
187 #define AliDebugStream(level) AliLog::Stream(AliLog::kDebug, level, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__)
188 #define AliDebugClassStream(level) AliLog::Stream(AliLog::kDebug, level, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__)
189 #define AliDebugGeneralStream(scope, level) AliLog::Stream(AliLog::kDebug, level, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__)
190
191
192 // info messages
193 #ifdef LOG_NO_INFO
194 #define AliInfo(message)
195 #define AliInfoClass(message)
196 #define AliInfoGeneral(scope, message)
197 #else
198 #define AliInfo(message) {AliLog::Message(AliLog::kInfo, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);}
199 #define AliInfoClass(message) {AliLog::Message(AliLog::kInfo, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);}
200 #define AliInfoGeneral(scope, message) {AliLog::Message(AliLog::kInfo, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);}
201 #endif
202
203 // redirection to info
204 #define StdoutToAliInfo(whatever) REDIRECTSTDOUT(AliLog::kInfo, 0, ClassName(), whatever)
205 #define StderrToAliInfo(whatever) REDIRECTSTDERR(AliLog::kInfo, 0, ClassName(), whatever)
206 #define ToAliInfo(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kInfo, 0, ClassName(), whatever)
207 #define StdoutToAliInfoClass(whatever) REDIRECTSTDOUT(AliLog::kInfo, 0, Class()->GetName(), whatever)
208 #define StderrToAliInfoClass(whatever) REDIRECTSTDERR(AliLog::kInfo, 0, Class()->GetName(), whatever)
209 #define ToAliInfoClass(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kInfo, 0, Class()->GetName(), whatever)
210 #define StdoutToAliInfoGeneral(scope, whatever) REDIRECTSTDOUT(AliLog::kInfo, 0, scope, whatever)
211 #define StderrToAliInfoGeneral(scope, whatever) REDIRECTSTDERR(AliLog::kInfo, 0, scope, whatever)
212 #define ToAliInfoGeneral(scope, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kInfo, 0, scope, whatever)
213
214 // info stream objects
215 #define AliInfoStream() AliLog::Stream(AliLog::kInfo, 0, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__)
216 #define AliInfoClassStream() AliLog::Stream(AliLog::kInfo, 0, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__)
217 #define AliInfoGeneralStream(scope) AliLog::Stream(AliLog::kInfo, 0, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__)
218
219
220 // warning messages
221 #ifdef LOG_NO_WARNING
222 #define AliWarning(message)
223 #define AliWarningClass(message)
224 #define AliWarningGeneral(scope, message)
225 #else
226 #define AliWarning(message) {AliLog::Message(AliLog::kWarning, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);}
227 #define AliWarningClass(message) {AliLog::Message(AliLog::kWarning, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);}
228 #define AliWarningGeneral(scope, message) {AliLog::Message(AliLog::kWarning, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);}
229 #endif
230
231 // redirection to warning
232 #define StdoutToAliWarning(whatever) REDIRECTSTDOUT(AliLog::kWarning, 0, ClassName(), whatever)
233 #define StderrToAliWarning(whatever) REDIRECTSTDERR(AliLog::kWarning, 0, ClassName(), whatever)
234 #define ToAliWarning(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kWarning, 0, ClassName(), whatever)
235 #define StdoutToAliWarningClass(whatever) REDIRECTSTDOUT(AliLog::kWarning, 0, Class()->GetName(), whatever)
236 #define StderrToAliWarningClass(whatever) REDIRECTSTDERR(AliLog::kWarning, 0, Class()->GetName(), whatever)
237 #define ToAliWarningClass(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kWarning, 0, Class()->GetName(), whatever)
238 #define StdoutToAliWarningGeneral(scope, whatever) REDIRECTSTDOUT(AliLog::kWarning, 0, scope, whatever)
239 #define StderrToAliWarningGeneral(scope, whatever) REDIRECTSTDERR(AliLog::kWarning, 0, scope, whatever)
240 #define ToAliWarningGeneral(scope, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kWarning, 0, scope, whatever)
241
242 // warning stream objects
243 #define AliWarningStream() AliLog::Stream(AliLog::kWarning, 0, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__)
244 #define AliWarningClassStream() AliLog::Stream(AliLog::kWarning, 0, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__)
245 #define AliWarningGeneralStream(scope) AliLog::Stream(AliLog::kWarning, 0, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__)
246
247
248 // error messages
249 #define AliError(message) {AliLog::Message(AliLog::kError, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);}
250 #define AliErrorClass(message) {AliLog::Message(AliLog::kError, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);}
251 #define AliErrorGeneral(scope, message) {AliLog::Message(AliLog::kError, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);}
252
253 // redirection to error
254 #define StdoutToAliError(whatever) REDIRECTSTDOUT(AliLog::kError, 0, ClassName(), whatever)
255 #define StderrToAliError(whatever) REDIRECTSTDERR(AliLog::kError, 0, ClassName(), whatever)
256 #define ToAliError(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kError, 0, ClassName(), whatever)
257 #define StdoutToAliErrorClass(whatever) REDIRECTSTDOUT(AliLog::kError, 0, Class()->GetName(), whatever)
258 #define StderrToAliErrorClass(whatever) REDIRECTSTDERR(AliLog::kError, 0, Class()->GetName(), whatever)
259 #define ToAliErrorClass(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kError, 0, Class()->GetName(), whatever)
260 #define StdoutToAliErrorGeneral(scope, whatever) REDIRECTSTDOUT(AliLog::kError, 0, scope, whatever)
261 #define StderrToAliErrorGeneral(scope, whatever) REDIRECTSTDERR(AliLog::kError, 0, scope, whatever)
262 #define ToAliErrorGeneral(scope, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kError, 0, scope, whatever)
263
264 // error stream objects
265 #define AliErrorStream() AliLog::Stream(AliLog::kError, 0, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__)
266 #define AliErrorClassStream() AliLog::Stream(AliLog::kError, 0, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__)
267 #define AliErrorGeneralStream(scope) AliLog::Stream(AliLog::kError, 0, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__)
268
269
270 // fatal messages
271 #define AliFatal(message) {AliLog::Message(AliLog::kFatal, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);}
272 #define AliFatalClass(message) {AliLog::Message(AliLog::kFatal, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);}
273 #define AliFatalGeneral(scope, message) {AliLog::Message(AliLog::kFatal, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);}
274
275 #endif