]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/BASE/AliHLTLogging.h
- cleaning up debug output
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTLogging.h
CommitLineData
098cca52 1//-*- Mode: C++ -*-
2// $Id$
3495cce2 3
4#ifndef ALIHLTLOGGING_H
5#define ALIHLTLOGGING_H
1e27470a 6/* This file is property of and copyright by the ALICE HLT Project *
7 * ALICE Experiment at CERN, All rights reserved. *
3495cce2 8 * See cxx source for full Copyright notice */
9
b22e91eb 10/** @file AliHLTLogging.h
11 @author Matthias Richter, Timm Steinbeck
12 @date
13 @brief HLT module logging primitives.
14*/
3495cce2 15
16#include "AliHLTDataTypes.h"
5f1685a0 17#include "AliHLTStdIncludes.h"
a1b2201f 18#include "TString.h"
fc455fba 19#include "TObject.h"
66043029 20#include "TArrayC.h"
3495cce2 21
a742f6f8 22class AliHLTComponentHandler;
85465857 23//#define LOG_PREFIX "" // logging prefix, for later extensions
3495cce2 24
db95fec3 25#define ALILOG_WRAPPER_LIBRARY "libHLTrec.so"
85465857 26
27/* the logging macros can be used inside methods of classes which inherit from
28 * AliHLTLogging
29 */
fc455fba 30// function name
31#if defined(__GNUC__) || defined(__ICC) || defined(__ECC) || defined(__APPLE__)
32#define FUNCTIONNAME() __FUNCTION__
33#else
34#define FUNCTIONNAME() "???"
a4a8ef64 35#endif
36
098cca52 37#ifndef ALIHLTLOGGINGVARIADICFREE_H
86a8c744 38// HLTMessage is not filtered
39#define HLTMessage( ... ) LoggingVarargs(kHLTLogNone, NULL , NULL , __FILE__ , __LINE__ , __VA_ARGS__ )
40
41// the following macros are filtered by the Global and Local Log Filter
7850e451 42#define HLTLog( level, ... ) if (CheckFilter(level)) LoggingVarargs(level, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
fc455fba 43#define HLTBenchmark( ... ) LoggingVarargs(kHLTLogBenchmark, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
1e27470a 44#ifdef __DEBUG
45#define HLTDebug( ... ) if (CheckFilter(kHLTLogDebug) && CheckGroup(Class_Name())) LoggingVarargs(kHLTLogDebug, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
46#else
47#define HLTDebug( ... )
48#endif
49#define HLTInfo( ... ) if (CheckFilter(kHLTLogInfo)) LoggingVarargs(kHLTLogInfo, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
50#define HLTWarning( ... ) if (CheckFilter(kHLTLogWarning)) LoggingVarargs(kHLTLogWarning, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
51#define HLTError( ... ) if (CheckFilter(kHLTLogError)) LoggingVarargs(kHLTLogError, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
52#define HLTFatal( ... ) if (CheckFilter(kHLTLogFatal)) LoggingVarargs(kHLTLogFatal, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
b2065764 53#define HLTImportant( ... ) if (CheckFilter(kHLTLogImportant))LoggingVarargs(kHLTLogImportant,Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
85465857 54
098cca52 55// the same macros are defined variadic free, in that case the message must be complete
56// include AliHLTLoggingVariadicFree.h
57#else //ALIHLTLOGGINGVARIADICFREE_H
86a8c744 58#define HLTMessage( message ) LoggingVarargs(kHLTLogNone, NULL , NULL , __FILE__ , __LINE__ , message )
7850e451 59#define HLTLog( level, message) if (CheckFilter(level)) LoggingVarargs(level, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
098cca52 60#define HLTBenchmark( message ) LoggingVarargs(kHLTLogBenchmark, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
61#ifdef __DEBUG
62#define HLTDebug( message ) if (CheckFilter(kHLTLogDebug) && CheckGroup(Class_Name())) LoggingVarargs(kHLTLogDebug, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
63#else
64#define HLTDebug( message )
65#endif
66#define HLTInfo( message ) if (CheckFilter(kHLTLogInfo)) LoggingVarargs(kHLTLogInfo, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
67#define HLTWarning( message ) if (CheckFilter(kHLTLogWarning)) LoggingVarargs(kHLTLogWarning, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
68#define HLTError( message ) if (CheckFilter(kHLTLogError)) LoggingVarargs(kHLTLogError, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
69#define HLTFatal( message ) if (CheckFilter(kHLTLogFatal)) LoggingVarargs(kHLTLogFatal, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
70#define HLTImportant( message ) if (CheckFilter(kHLTLogImportant))LoggingVarargs(kHLTLogImportant,Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
71#endif //ALIHLTLOGGINGVARIADICFREE_H
72
85465857 73// helper macro to set the keyword
3a7c0444 74#define HLTLogKeyword(a) AliHLTKeyword hltlogTmpkey(this, a)
85465857 75
76#define HLT_DEFAULT_LOG_KEYWORD "no key"
3495cce2 77
66108417 78/**
79 * @class AliHLTLogging
80 * Basic logging class. All classes inherit the besic HLT logging functionality.
81 * Logging levels are controlled by a global logging filter and a local logging
82 * filter.
83 *
84 * @section alihlt_logging_levels Logging Levels
85 * Logging levels are switched by a bit pattern, AliHLTComponentLogSeverity {
86 * - ::kHLTLogNone no logging (0)
87 * - ::kHLTLogBenchmark benchmark messages (0x1)
88 * - ::kHLTLogDebug debug messages (0x2)
89 * - ::kHLTLogInfo info messages (0x4)
90 * - ::kHLTLogWarning warning messages (0x8)
91 * - ::kHLTLogError error messages (0x10)
92 * - ::kHLTLogFatal fatal error messages (0x20)
93 * - ::kHLTLogImportant few important messages not to be filtered out (0x40)
94 * - ::kHLTLogAll special value to enable all messages (0x7f)
95 * - ::kHLTLogDefault the default logging level: Warning, Error, Fatal, Important (0x79)
96 *
97 * @section alihlt_logging_filter Logging Filters
98 * The class provides a global and a local logging filter, the AND beween both
99 * defines whether a message is printed or not.
100 *
101 * The global filter is by default set to ::kHLTLogAll. Please note that AliHLTSystem
102 * changes the global logging level to ::kHLTLogDefault. The global filter can be
103 * adjusted by means of SetGlobalLoggingLevel().
104 *
105 * The local filter is set to ::kHLTLogAll and can be adjusted by
106 * SetLocalLoggingLevel(). The default can be changed for all objects by
107 * SetLocalLoggingDefault(). Please note that a change of the default level only
108 * applies to objects generated after the change of the default.
109 *
110 * @section alihlt_logging_external Redirection
111 * - external logging function
112 * - keyword
113 *
114 * @section alihlt_logging_aliroot AliRoot Redirection
115 * - switching of redirection
116 * - logging options in AliSimulation/AliReconstruction
117 *
118 * @ingroup alihlt_component
119 */
3495cce2 120class AliHLTLogging {
121public:
122 AliHLTLogging();
85869391 123 AliHLTLogging(const AliHLTLogging&);
124 AliHLTLogging& operator=(const AliHLTLogging&);
3495cce2 125 virtual ~AliHLTLogging();
126
a742f6f8 127 /** set the default key word
128 * the keyword is intended to simplify the use of logging macros
129 */
85465857 130 void SetDefaultKeyword(const char* keyword) { fpDefaultKeyword=keyword; }
131
a742f6f8 132 /**
133 * Set a temporary keyword
134 * returns the old key value
135 */
85465857 136 const char* SetKeyword(const char* keyword)
137 {
138 const char* currentKeyword=fpCurrentKeyword;
139 fpCurrentKeyword=keyword;
140 return currentKeyword;
141 }
142
a742f6f8 143 /**
144 * Get the current keyword
145 */
85869391 146 const char* GetKeyword() const
85465857 147 {
148 if (fpCurrentKeyword) return fpCurrentKeyword;
149 else if (fpDefaultKeyword) return fpDefaultKeyword;
150 return HLT_DEFAULT_LOG_KEYWORD;
151 }
3495cce2 152
a742f6f8 153 /**
154 * Init the AliLogging class for use from external package.
155 * This initializes the logging callback. <br>
156 * Only deployed by external users of the C wrapper interface, not used
157 * when running in AliRoot
158 */
bb16cc41 159 static int Init(AliHLTfctLogging pFun);
3495cce2 160
a742f6f8 161 /**
162 * Init the message trap in AliLog.
163 * This initializes the AliLog trap, the AliLog class is the logging
164 * mechanism of AliRoot. The trap can fetch log messages written to
165 * AliLog, components and detector algorithms can use the AliLog
166 * mechanism to be as close as possible to Offline habits. <br>
167 * Only used with external users of the C wrapper interface, not used
168 * when running in AliRoot
169 */
170 static int InitAliLogTrap(AliHLTComponentHandler* pHandler);
171
db95fec3 172 /**
173 * Init the AliRoot logging function.
174 * All log messages are redirected to AliLog when running in AliRoot.
175 * Note: when running in PubSub, AliLog messages are redirected to PubSub,
176 * see AliHLTLogging::InitAliLogTrap
177 */
178 static int InitAliLogFunc(AliHLTComponentHandler* pHandler);
179
a742f6f8 180 /**
181 * Genaral logging function
182 */
8ede8717 183 int Logging( AliHLTComponentLogSeverity severity, const char* origin, const char* keyword, const char* message, ... );
3495cce2 184
97d2b87a 185 /**
a742f6f8 186 * Logging function with two origin parameters, used by the log macros
187 */
97d2b87a 188 virtual int LoggingVarargs(AliHLTComponentLogSeverity severity,
189 const char* originClass, const char* originFunc,
190 const char* file, int line, ... ) const;
191
192 /**
193 * Send formatted string to the different channels
194 */
195 int SendMessage(AliHLTComponentLogSeverity severity,
196 const char* originClass, const char* originFunc,
197 const char* file, int line,
198 const char* message) const;
3495cce2 199
1e27470a 200 /**
201 * Evaluate the group of the debug message from the class name.
202 * @return 1 if message should be printed
203 */
204 int CheckGroup(const char* originClass) const;
205
206 /**
207 * Set the black list of classes.
208 * If the white list is set, debug messages are skipped for
209 * all classes matching one of the regular expressions in the string.
210 */
211 static int SetBlackList(const char* classnames);
212
213 /**
214 * Set the white list of classes.
215 * If the white list is set, debug messages are only printed for
216 * classes matching one of the regular expressions in the string.
217 */
218 static int SetWhiteList(const char* classnames);
219
a742f6f8 220 /**
221 * Apply filter
222 * @return 1 if message should pass
223 */
8ede8717 224 int CheckFilter(AliHLTComponentLogSeverity severity) const;
3495cce2 225
a742f6f8 226 /**
227 * Set global logging level
228 * logging filter for all objects
229 */
5f5b708b 230 static void SetGlobalLoggingLevel(AliHLTComponentLogSeverity level);
231
a742f6f8 232 /**
233 * Get global logging level
234 * logging filter for all objects
235 */
236 static AliHLTComponentLogSeverity GetGlobalLoggingLevel();
237
238 /**
239 * Set local logging level
240 * logging filter for individual object
241 */
dba03d72 242 virtual void SetLocalLoggingLevel(AliHLTComponentLogSeverity level);
5f5b708b 243
66108417 244 /**
245 * Set local logging default
246 * Default logging filter for individual objects.
247 */
248 static void SetLocalLoggingDefault(AliHLTComponentLogSeverity level);
249
fc455fba 250 /**
a742f6f8 251 * Get local logging level
252 * logging filter for individual object
fc455fba 253 */
a742f6f8 254 AliHLTComponentLogSeverity GetLocalLoggingLevel();
3495cce2 255
fc455fba 256 /**
a742f6f8 257 * Print message to stdout
fc455fba 258 */
a742f6f8 259 static int Message(void * param, AliHLTComponentLogSeverity severity, const char* origin, const char* keyword, const char* message);
fc455fba 260
261 /**
262 * Build the log string from format specifier and variadac arguments
263 * @param format format string of printf style
264 * @param ap opened and initialized argument list
97d2b87a 265 * @param bAppend append to current content
266 * @return const char string with the formatted message
267 */
268 static const char* BuildLogString(const char *format, va_list ap, bool bAppend=false);
269
270 /**
271 * Set the log string from format specifier and from variable arguments.
272 * @param format format string of printf style
fc455fba 273 * @return const char string with the formatted message
274 */
7efb6418 275 static const char* SetLogString(const void* p, const char* pfmt, const char *format, ... );
3495cce2 276
66043029 277 /**
278 * Get parameter given by the external caller.
279 * This functionality is not yet implemented. It is intended
280 * to pass the parameter pointer given to the component at
281 * initialization back to the caller.
282 */
283 virtual void* GetParameter() const {return NULL;}
fc455fba 284
285 /**
286 * Switch logging through AliLog on or off
287 * @param sw 1 = logging through AliLog
288 */
289 void SwitchAliLog(int sw) {fgUseAliLog=(sw!=0);}
290
66043029 291 /** target stream for AliRoot logging methods */
292 static ostringstream fgLogstr; //! transient
a742f6f8 293
294 /**
295 * The message function for dynamic use.
296 * In order to avoid dependencies on AliRoot libraries, libHLTbase loads
297 * the library dynamically and looks for the symbol.
298 */
299 typedef int (*AliHLTDynamicMessage)(AliHLTComponentLogSeverity severity,
300 const char* originClass,
301 const char* originFunc,
302 const char* file, int line,
303 const char* message);
304
305 /**
306 * The init function of the message callback for dynamic use.
307 * In order to avoid dependencies on AliRoot libraries, libHLTbase loads
308 * the library dynamically and looks for the symbol.
309 */
310 typedef int (*InitAliDynamicMessageCallback)();
66043029 311
3495cce2 312protected:
a742f6f8 313 /** the AliRoot logging function */
314 static AliHLTDynamicMessage fgAliLoggingFunc; //! transient
3495cce2 315
316private:
fc455fba 317 /** the global logging filter */
66043029 318 static AliHLTComponentLogSeverity fgGlobalLogFilter; // see above
fc455fba 319 /** the local logging filter for one class */
320 AliHLTComponentLogSeverity fLocalLogFilter; // see above
66108417 321 /** the global logging filter */
322 static AliHLTComponentLogSeverity fgLocalLogDefault; // see above
fc455fba 323 /** logging callback from the framework */
66043029 324 static AliHLTfctLogging fgLoggingFunc; // see above
fc455fba 325 /** default keyword */
326 const char* fpDefaultKeyword; //! transient
327 /** current keyword */
328 const char* fpCurrentKeyword; //! transient
329 /** switch for logging through AliLog, default on */
330 static int fgUseAliLog; // see above
66043029 331 /**
332 * The global logging buffer.
333 * The buffer is created with an initial size and grown dynamically on
334 * demand.
335 */
336 static TArrayC fgAliHLTLoggingTarget; //! transient
337
338 /** the maximum size of the buffer */
339 static const int fgkALIHLTLOGGINGMAXBUFFERSIZE; //! transient
1e27470a 340
341 /** groups of classes not to print debug messages */
342 static TString fgBlackList; //! transient
343
344 /** groups of classes not to print debug messages */
345 static TString fgWhiteList; //! transient
a742f6f8 346
1e27470a 347 ClassDef(AliHLTLogging, 3)
3495cce2 348};
85465857 349
350/* the class AliHLTKeyword is a simple helper class used by the HLTLogKeyword macro
351 * HLTLogKeyword("a keyword") creates an object of AliHLTKeyword which sets the keyword for the logging class
352 * the object is destroyed automatically when the current scope is left and so the keyword is set
353 * to the original value
354 */
355class AliHLTKeyword {
356 public:
357 AliHLTKeyword()
85869391 358 :
359 fpParent(NULL),
360 fpOriginal(NULL)
85465857 361 {
85465857 362 }
363
364 AliHLTKeyword(AliHLTLogging* parent, const char* keyword)
85869391 365 :
366 fpParent(parent),
367 fpOriginal(NULL)
85465857 368 {
85465857 369 if (parent) {
85465857 370 fpOriginal=fpParent->SetKeyword(keyword);
371 }
372 }
373
85869391 374 AliHLTKeyword(const AliHLTKeyword& kw)
375 :
376 fpParent(kw.fpParent),
377 fpOriginal(kw.fpOriginal)
378 {
379 }
380
381 AliHLTKeyword& operator=(const AliHLTKeyword& kw)
382 {
383 fpParent=kw.fpParent;
384 fpOriginal=kw.fpOriginal;
385 return *this;
386 }
387
85465857 388 ~AliHLTKeyword()
389 {
390 if (fpParent) {
391 fpParent->SetKeyword(fpOriginal);
392 }
393 }
394
395 private:
66043029 396 AliHLTLogging* fpParent; //! transient
397 const char* fpOriginal; //! transient
85465857 398};
3495cce2 399#endif
400