3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * See cxx source for full Copyright notice */
9 /// class for logging debug, info and error messages
13 #include <TObjArray.h>
17 class AliLog: public TObject {
21 static AliLog* Instance() {return fgInstance;}
23 enum EType {kFatal = 0, kError, kWarning, kInfo, kDebug, kMaxType};
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);
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);
43 static void SetHandleRootMessages(Bool_t on);
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);
54 static void Write(const char* name, Int_t option = 0);
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);
68 AliLog(const AliLog& log);
69 AliLog& operator = (const AliLog& log);
71 static void RootErrorHandler(Int_t level, Bool_t abort,
72 const char* location, const char* message);
74 void CloseFile(Int_t type);
75 FILE* GetOutputStream(Int_t type);
77 UInt_t GetLogLevel(const char* module, const char* className) const;
79 enum {kDebugOffset = kDebug-1};
81 static AliLog* fgInstance; //! pointer to current instance
83 static Bool_t fgDebugEnabled; // flag for debug en-/disabling
85 UInt_t fGlobalLogLevel; // global logging level
86 TObjArray fModuleDebugLevels; // debug levels for modules
87 TObjArray fClassDebugLevels; // debug levels for classes
89 Int_t fOutputTypes[kMaxType]; // types of output streams
90 TString fFileNames[kMaxType]; // file names
91 FILE* fOutputFiles[kMaxType]; //! log output files
93 Bool_t fPrintType[kMaxType]; // print type on/off
94 Bool_t fPrintModule[kMaxType]; // print module on/off
95 Bool_t fPrintScope[kMaxType]; // print scope/class name on/off
96 Bool_t fPrintLocation[kMaxType]; // print file and line on/off
98 ClassDef(AliLog, 1) // class for logging debug, info and error messages
103 #define AliDebugLevel() -1
104 #define AliDebugLevelClass() -1
105 #define AliDebugLevelGeneral(scope) -1
107 #define AliDebugLevel() ((AliLog::IsDebugEnabled()) ? AliLog::GetDebugLevel(__MODULE__, ClassName()) : -1)
108 #define AliDebugLevelClass() ((AliLog::IsDebugEnabled()) ? AliLog::GetDebugLevel(__MODULE__, Class()->GetName()) : -1)
109 #define AliDebugLevelGeneral(scope) ((AliLog::IsDebugEnabled()) ? AliLog::GetDebugLevel(__MODULE__, scope) : -1)
113 #define AliDebug(level, message)
114 #define AliDebugClass(level, message)
115 #define AliDebugGeneral(scope, level, message)
117 #define AliDebug(level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, __MODULE__, ClassName(), __FUNCTION__, __FILE__, __LINE__);}
118 #define AliDebugClass(level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, __MODULE__, Class()->GetName(), __FUNCTION__, __FILE__, __LINE__);}
119 #define AliDebugGeneral(scope, level, message) {if (AliLog::IsDebugEnabled()) AliLog::Debug(level, message, __MODULE__, scope, __FUNCTION__, __FILE__, __LINE__);}
123 #define AliInfo(message)
124 #define AliInfoClass(message)
125 #define AliInfoGeneral(scope, message)
127 #define AliInfo(message) {AliLog::Message(AliLog::kInfo, message, __MODULE__, ClassName(), __FUNCTION__, __FILE__, __LINE__);}
128 #define AliInfoClass(message) {AliLog::Message(AliLog::kInfo, message, __MODULE__, Class()->GetName(), __FUNCTION__, __FILE__, __LINE__);}
129 #define AliInfoGeneral(scope, message) {AliLog::Message(AliLog::kInfo, message, __MODULE__, scope, __FUNCTION__, __FILE__, __LINE__);}
132 #ifdef LOG_NO_WARNING
133 #define AliWarning(message)
134 #define AliWarningClass(message)
135 #define AliWarningGeneral(scope, message)
137 #define AliWarning(message) {AliLog::Message(AliLog::kWarning, message, __MODULE__, ClassName(), __FUNCTION__, __FILE__, __LINE__);}
138 #define AliWarningClass(message) {AliLog::Message(AliLog::kWarning, message, __MODULE__, Class()->GetName(), __FUNCTION__, __FILE__, __LINE__);}
139 #define AliWarningGeneral(scope, message) {AliLog::Message(AliLog::kWarning, message, __MODULE__, scope, __FUNCTION__, __FILE__, __LINE__);}
142 #define AliError(message) {AliLog::Message(AliLog::kError, message, __MODULE__, ClassName(), __FUNCTION__, __FILE__, __LINE__);}
143 #define AliErrorClass(message) {AliLog::Message(AliLog::kError, message, __MODULE__, Class()->GetName(), __FUNCTION__, __FILE__, __LINE__);}
144 #define AliErrorGeneral(scope, message) {AliLog::Message(AliLog::kError, message, __MODULE__, scope, __FUNCTION__, __FILE__, __LINE__);}
146 #define AliFatal(message) {AliLog::Message(AliLog::kFatal, message, __MODULE__, ClassName(), __FUNCTION__, __FILE__, __LINE__);}
147 #define AliFatalClass(message) {AliLog::Message(AliLog::kFatal, message, __MODULE__, Class()->GetName(), __FUNCTION__, __FILE__, __LINE__);}
148 #define AliFatalGeneral(scope, message) {AliLog::Message(AliLog::kFatal, message, __MODULE__, scope, __FUNCTION__, __FILE__, __LINE__);}