]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliLog.h
Fixed: GetStringArray(Int_t index) should return TObjString*
[u/mrichter/AliRoot.git] / STEER / AliLog.h
CommitLineData
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
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
17class AliLog: public TObject {
18 public:
19 AliLog();
20 virtual ~AliLog();
21 static AliLog* Instance() {return fgInstance;}
22
44ce6bbe 23 enum EType_t {kFatal = 0, kError, kWarning, kInfo, kDebug, kMaxType};
1948744e 24 typedef void (*AliLogNotification)(EType_t type, const char* message );
25
6ab674bd 26
27 static void EnableDebug(Bool_t enabled);
44ce6bbe 28 static void SetGlobalLogLevel(EType_t type);
6ab674bd 29 static Int_t GetGlobalLogLevel();
30 static void SetGlobalDebugLevel(Int_t level);
31 static Int_t GetGlobalDebugLevel();
32 static void SetModuleDebugLevel(const char* module, Int_t level);
33 static void ClearModuleDebugLevel(const char* module);
34 static void SetClassDebugLevel(const char* className, Int_t level);
35 static void ClearClassDebugLevel(const char* className);
36
37 static void SetStandardOutput();
44ce6bbe 38 static void SetStandardOutput(EType_t type);
6ab674bd 39 static void SetErrorOutput();
44ce6bbe 40 static void SetErrorOutput(EType_t type);
6ab674bd 41 static void SetFileOutput(const char* fileName);
44ce6bbe 42 static void SetFileOutput(EType_t type, const char* fileName);
1948744e 43 static void SetStreamOutput(ostream* stream);
44 static void SetStreamOutput(EType_t type, ostream* stream);
45 static void SetLogNotification(AliLogNotification pCallBack);
46 static void SetLogNotification(EType_t type, AliLogNotification pCallBack);
6ab674bd 47 static void Flush();
48
49 static void SetHandleRootMessages(Bool_t on);
50
51 static void SetPrintType(Bool_t on);
44ce6bbe 52 static void SetPrintType(EType_t type, Bool_t on);
6ab674bd 53 static void SetPrintModule(Bool_t on);
44ce6bbe 54 static void SetPrintModule(EType_t type, Bool_t on);
6ab674bd 55 static void SetPrintScope(Bool_t on);
44ce6bbe 56 static void SetPrintScope(EType_t type, Bool_t on);
6ab674bd 57 static void SetPrintLocation(Bool_t on);
44ce6bbe 58 static void SetPrintLocation(EType_t type, Bool_t on);
6ab674bd 59
45fa0297 60 static void SetPrintRepetitions(Bool_t on);
61
c4cb6153 62 static void WriteToFile(const char* name, Int_t option = 0);
6ab674bd 63
64 // the following public methods are used by the preprocessor macros
65 // and should not be called directly
20848f77 66 static Bool_t IsDebugEnabled() {return fgDebugEnabled;}
6ab674bd 67 static Int_t GetDebugLevel(const char* module, const char* className);
68 static void Message(UInt_t level, const char* message,
69 const char* module, const char* className,
70 const char* function, const char* file, Int_t line);
71 static void Debug(UInt_t level, const char* message,
72 const char* module, const char* className,
73 const char* function, const char* file, Int_t line);
74
44ce6bbe 75 static Int_t RedirectStdoutTo(EType_t type, UInt_t level, const char* module,
eeb769e2 76 const char* className, const char* function,
77 const char* file, Int_t line, Bool_t print);
44ce6bbe 78 static Int_t RedirectStderrTo(EType_t type, UInt_t level, const char* module,
eeb769e2 79 const char* className, const char* function,
80 const char* file, Int_t line, Bool_t print);
81 static void RestoreStdout(Int_t original);
82 static void RestoreStderr(Int_t original);
83
44ce6bbe 84 static ostream& Stream(EType_t type, UInt_t level,
eeb769e2 85 const char* module, const char* className,
86 const char* function, const char* file, Int_t line);
87
6ab674bd 88 private:
89 AliLog(const AliLog& log);
90 AliLog& operator = (const AliLog& log);
91
eeb769e2 92 void ReadEnvSettings();
93
6ab674bd 94 static void RootErrorHandler(Int_t level, Bool_t abort,
95 const char* location, const char* message);
96
97 void CloseFile(Int_t type);
98 FILE* GetOutputStream(Int_t type);
99
100 UInt_t GetLogLevel(const char* module, const char* className) const;
eeb769e2 101 void PrintMessage(UInt_t type, const char* message,
102 const char* module, const char* className,
103 const char* function,
104 const char* file, Int_t line);
1948744e 105
106 void PrintString(Int_t type, FILE* stream, const char* format, ...);
45fa0297 107 void PrintRepetitions();
eeb769e2 108
44ce6bbe 109 Int_t RedirectTo(FILE* stream, EType_t type, UInt_t level,
eeb769e2 110 const char* module, const char* className,
111 const char* function,
112 const char* file, Int_t line, Bool_t print);
113
44ce6bbe 114 ostream& GetStream(EType_t type, UInt_t level,
eeb769e2 115 const char* module, const char* className,
116 const char* function, const char* file, Int_t line);
6ab674bd 117
118 enum {kDebugOffset = kDebug-1};
119
120 static AliLog* fgInstance; //! pointer to current instance
121
122 static Bool_t fgDebugEnabled; // flag for debug en-/disabling
123
124 UInt_t fGlobalLogLevel; // global logging level
125 TObjArray fModuleDebugLevels; // debug levels for modules
126 TObjArray fClassDebugLevels; // debug levels for classes
127
128 Int_t fOutputTypes[kMaxType]; // types of output streams
129 TString fFileNames[kMaxType]; // file names
130 FILE* fOutputFiles[kMaxType]; //! log output files
1948744e 131 ostream* fOutputStreams[kMaxType]; //! log output streams
6ab674bd 132
133 Bool_t fPrintType[kMaxType]; // print type on/off
134 Bool_t fPrintModule[kMaxType]; // print module on/off
135 Bool_t fPrintScope[kMaxType]; // print scope/class name on/off
136 Bool_t fPrintLocation[kMaxType]; // print file and line on/off
137
45fa0297 138 Bool_t fPrintRepetitions; // print number of repetitions instead of repeated message on/off
139
140 Int_t fRepetitions; //! counter of repetitions
141 UInt_t fLastType; //! type of last message
142 TString fLastMessage; //! last message
143 TString fLastModule; //! module name of last message
144 TString fLastClassName; //! class name of last message
145 TString fLastFunction; //! function name of last message
146 TString fLastFile; //! file name of last message
147 Int_t fLastLine; //! line number of last message
1948744e 148 AliLogNotification fCallBacks[kMaxType]; //! external notification callback
45fa0297 149
6ab674bd 150 ClassDef(AliLog, 1) // class for logging debug, info and error messages
151};
152
eeb769e2 153
154// module name
eb5bc777 155#ifdef _MODULE_
156#define MODULENAME() _MODULE_
eeb769e2 157#else
158#define MODULENAME() "NoModule"
cd676389 159#endif
eeb769e2 160
161// function name
162#if defined(__GNUC__) || defined(__ICC) || defined(__ECC) || defined(__APPLE__)
163#define FUNCTIONNAME() __FUNCTION__
92154bc0 164// #elif defined(__HP_aCC) || defined(__alpha) || defined(__DECCXX)
165// #define FUNCTIONNAME() __FUNC__
eeb769e2 166#else
167#define FUNCTIONNAME() "???"
cd676389 168#endif
6ab674bd 169
eeb769e2 170// redirection
171#define REDIRECTSTDOUT(type, level, scope, whatever) {Int_t originalStdout = AliLog::RedirectStdoutTo(type, level, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__, kFALSE); whatever; AliLog::RestoreStdout(originalStdout);}
172#define REDIRECTSTDERR(type, level, scope, whatever) {Int_t originalStderr = AliLog::RedirectStderrTo(type, level, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__, kFALSE); whatever; AliLog::RestoreStderr(originalStderr);}
173#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);}
174
175
176// debug level
6ab674bd 177#ifdef LOG_NO_DEBUG
178#define AliDebugLevel() -1
179#define AliDebugLevelClass() -1
180#define AliDebugLevelGeneral(scope) -1
181#else
eeb769e2 182#define AliDebugLevel() ((AliLog::IsDebugEnabled()) ? AliLog::GetDebugLevel(MODULENAME(), ClassName()) : -1)
183#define AliDebugLevelClass() ((AliLog::IsDebugEnabled()) ? AliLog::GetDebugLevel(MODULENAME(), Class()->GetName()) : -1)
184#define AliDebugLevelGeneral(scope) ((AliLog::IsDebugEnabled()) ? AliLog::GetDebugLevel(MODULENAME(), scope) : -1)
6ab674bd 185#endif
186
eeb769e2 187// debug messages
6ab674bd 188#ifdef LOG_NO_DEBUG
189#define AliDebug(level, message)
190#define AliDebugClass(level, message)
191#define AliDebugGeneral(scope, level, message)
192#else
267f939c 193/** @defn AliDebug
194 @param N Debug level - always evaluated
195 @param A Argument Form(including paranthesis) - the message to
196 print. Note, that @a A should contain balanced paranthesis, like
197 @verbatim
198 AliDebug(1, Form("Failed to decode line %d of %s", line, filename));
199 @endverbatim
200 The point is, if the current log level isn't high enough, as
201 returned by the AliLog object, then we do not want to evalute the
202 call to Form, since that is an expensive call. We should always
203 put macros like this into a @c do ... @c while loop, since that
204 makes sure that evaluations are local, and that we can safely put
205 a @c ; after the macro call. Note, that @c do ... @c while loop
206 and the call with extra paranthis, are an old tricks used by many
207 C coders (see for example Bison, the Linux kernel, and the like).
208 Christian Holm Christensen
209*/
210#define AliDebug(N, A) \
211 do { \
212 if (!AliLog::IsDebugEnabled() || \
213 AliLog::GetDebugLevel(MODULENAME(), ClassName()) < N) break; \
214 AliLog::Debug(N, A, MODULENAME(), ClassName(), FUNCTIONNAME(), \
215 __FILE__, __LINE__); } while (false)
216//#define AliDebug(level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);}
217#define AliDebugClass(N, A) \
218 do { \
219 if (!AliLog::IsDebugEnabled() || \
220 AliLog::GetDebugLevel(MODULENAME(), Class()->GetName()) < N) break; \
221 AliLog::Debug(N, A, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), \
222 __FILE__, __LINE__); } while (false)
223//#define AliDebugClass(level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);}
224#define AliDebugGeneral(scope, N, A) \
225 do { \
226 if (!AliLog::IsDebugEnabled() || \
227 AliLog::GetDebugLevel(MODULENAME(), scope) < N) break; \
228 AliLog::Debug(N, A, MODULENAME(), scope, FUNCTIONNAME(), \
229 __FILE__, __LINE__); } while (false)
230//#define AliDebugGeneral(scope, level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);}
6ab674bd 231#endif
232
eeb769e2 233// redirection to debug
234#define StdoutToAliDebug(level, whatever) REDIRECTSTDOUT(AliLog::kDebug, level, ClassName(), whatever)
235#define StderrToAliDebug(level, whatever) REDIRECTSTDERR(AliLog::kDebug, level, ClassName(), whatever)
236#define ToAliDebug(level, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kDebug, level, ClassName(), whatever)
237#define StdoutToAliDebugClass(level, whatever) REDIRECTSTDOUT(AliLog::kDebug, level, Class()->GetName(), whatever)
238#define StderrToAliDebugClass(level, whatever) REDIRECTSTDERR(AliLog::kDebug, level, Class()->GetName(), whatever)
239#define ToAliDebugClass(level, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kDebug, level, Class()->GetName(), whatever)
240#define StdoutToAliDebugGeneral(scope, level, whatever) REDIRECTSTDOUT(AliLog::kDebug, level, scope, whatever)
241#define StderrToAliDebugGeneral(scope, level, whatever) REDIRECTSTDERR(AliLog::kDebug, level, scope, whatever)
242#define ToAliDebugGeneral(scope, level, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kDebug, level, scope, whatever)
243
244// debug stream objects
245#define AliDebugStream(level) AliLog::Stream(AliLog::kDebug, level, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__)
246#define AliDebugClassStream(level) AliLog::Stream(AliLog::kDebug, level, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__)
247#define AliDebugGeneralStream(scope, level) AliLog::Stream(AliLog::kDebug, level, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__)
248
249
250// info messages
6ab674bd 251#ifdef LOG_NO_INFO
252#define AliInfo(message)
253#define AliInfoClass(message)
254#define AliInfoGeneral(scope, message)
255#else
eeb769e2 256#define AliInfo(message) {AliLog::Message(AliLog::kInfo, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);}
257#define AliInfoClass(message) {AliLog::Message(AliLog::kInfo, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);}
258#define AliInfoGeneral(scope, message) {AliLog::Message(AliLog::kInfo, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);}
6ab674bd 259#endif
260
eeb769e2 261// redirection to info
262#define StdoutToAliInfo(whatever) REDIRECTSTDOUT(AliLog::kInfo, 0, ClassName(), whatever)
263#define StderrToAliInfo(whatever) REDIRECTSTDERR(AliLog::kInfo, 0, ClassName(), whatever)
264#define ToAliInfo(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kInfo, 0, ClassName(), whatever)
265#define StdoutToAliInfoClass(whatever) REDIRECTSTDOUT(AliLog::kInfo, 0, Class()->GetName(), whatever)
266#define StderrToAliInfoClass(whatever) REDIRECTSTDERR(AliLog::kInfo, 0, Class()->GetName(), whatever)
267#define ToAliInfoClass(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kInfo, 0, Class()->GetName(), whatever)
268#define StdoutToAliInfoGeneral(scope, whatever) REDIRECTSTDOUT(AliLog::kInfo, 0, scope, whatever)
269#define StderrToAliInfoGeneral(scope, whatever) REDIRECTSTDERR(AliLog::kInfo, 0, scope, whatever)
270#define ToAliInfoGeneral(scope, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kInfo, 0, scope, whatever)
271
272// info stream objects
273#define AliInfoStream() AliLog::Stream(AliLog::kInfo, 0, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__)
274#define AliInfoClassStream() AliLog::Stream(AliLog::kInfo, 0, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__)
275#define AliInfoGeneralStream(scope) AliLog::Stream(AliLog::kInfo, 0, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__)
276
277
278// warning messages
6ab674bd 279#ifdef LOG_NO_WARNING
280#define AliWarning(message)
281#define AliWarningClass(message)
282#define AliWarningGeneral(scope, message)
283#else
eeb769e2 284#define AliWarning(message) {AliLog::Message(AliLog::kWarning, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);}
285#define AliWarningClass(message) {AliLog::Message(AliLog::kWarning, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);}
286#define AliWarningGeneral(scope, message) {AliLog::Message(AliLog::kWarning, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);}
6ab674bd 287#endif
288
eeb769e2 289// redirection to warning
290#define StdoutToAliWarning(whatever) REDIRECTSTDOUT(AliLog::kWarning, 0, ClassName(), whatever)
291#define StderrToAliWarning(whatever) REDIRECTSTDERR(AliLog::kWarning, 0, ClassName(), whatever)
292#define ToAliWarning(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kWarning, 0, ClassName(), whatever)
293#define StdoutToAliWarningClass(whatever) REDIRECTSTDOUT(AliLog::kWarning, 0, Class()->GetName(), whatever)
294#define StderrToAliWarningClass(whatever) REDIRECTSTDERR(AliLog::kWarning, 0, Class()->GetName(), whatever)
295#define ToAliWarningClass(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kWarning, 0, Class()->GetName(), whatever)
296#define StdoutToAliWarningGeneral(scope, whatever) REDIRECTSTDOUT(AliLog::kWarning, 0, scope, whatever)
297#define StderrToAliWarningGeneral(scope, whatever) REDIRECTSTDERR(AliLog::kWarning, 0, scope, whatever)
298#define ToAliWarningGeneral(scope, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kWarning, 0, scope, whatever)
299
300// warning stream objects
301#define AliWarningStream() AliLog::Stream(AliLog::kWarning, 0, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__)
302#define AliWarningClassStream() AliLog::Stream(AliLog::kWarning, 0, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__)
303#define AliWarningGeneralStream(scope) AliLog::Stream(AliLog::kWarning, 0, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__)
304
305
306// error messages
307#define AliError(message) {AliLog::Message(AliLog::kError, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);}
308#define AliErrorClass(message) {AliLog::Message(AliLog::kError, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);}
309#define AliErrorGeneral(scope, message) {AliLog::Message(AliLog::kError, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);}
310
311// redirection to error
312#define StdoutToAliError(whatever) REDIRECTSTDOUT(AliLog::kError, 0, ClassName(), whatever)
313#define StderrToAliError(whatever) REDIRECTSTDERR(AliLog::kError, 0, ClassName(), whatever)
314#define ToAliError(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kError, 0, ClassName(), whatever)
315#define StdoutToAliErrorClass(whatever) REDIRECTSTDOUT(AliLog::kError, 0, Class()->GetName(), whatever)
316#define StderrToAliErrorClass(whatever) REDIRECTSTDERR(AliLog::kError, 0, Class()->GetName(), whatever)
317#define ToAliErrorClass(whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kError, 0, Class()->GetName(), whatever)
318#define StdoutToAliErrorGeneral(scope, whatever) REDIRECTSTDOUT(AliLog::kError, 0, scope, whatever)
319#define StderrToAliErrorGeneral(scope, whatever) REDIRECTSTDERR(AliLog::kError, 0, scope, whatever)
320#define ToAliErrorGeneral(scope, whatever) REDIRECTSTDOUTANDSTDERR(AliLog::kError, 0, scope, whatever)
321
322// error stream objects
323#define AliErrorStream() AliLog::Stream(AliLog::kError, 0, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__)
324#define AliErrorClassStream() AliLog::Stream(AliLog::kError, 0, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__)
325#define AliErrorGeneralStream(scope) AliLog::Stream(AliLog::kError, 0, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__)
326
6ab674bd 327
eeb769e2 328// fatal messages
329#define AliFatal(message) {AliLog::Message(AliLog::kFatal, message, MODULENAME(), ClassName(), FUNCTIONNAME(), __FILE__, __LINE__);}
330#define AliFatalClass(message) {AliLog::Message(AliLog::kFatal, message, MODULENAME(), Class()->GetName(), FUNCTIONNAME(), __FILE__, __LINE__);}
331#define AliFatalGeneral(scope, message) {AliLog::Message(AliLog::kFatal, message, MODULENAME(), scope, FUNCTIONNAME(), __FILE__, __LINE__);}
6ab674bd 332
333#endif