]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/BASE/AliHLTLogging.cxx
Update master to aliroot
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTLogging.cxx
CommitLineData
c515df4c 1// $Id$
3495cce2 2
c515df4c 3///**************************************************************************
4///* This file is property of and copyright by the *
5///* ALICE Experiment at CERN, All rights reserved. *
6///* *
7///* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
8///* for The ALICE HLT Project. *
9///* *
10///* Permission to use, copy, modify and distribute this software and its *
11///* documentation strictly for non-commercial purposes is hereby granted *
12///* without fee, provided that the above copyright notice appears in all *
13///* copies and that both the copyright notice and this permission notice *
14///* appear in the supporting documentation. The authors make no claims *
15///* about the suitability of this software for any purpose. It is *
16///* provided "as is" without express or implied warranty. *
17///**************************************************************************
3495cce2 18
c515df4c 19/// @file AliHLTLogging.cxx
20/// @author Matthias Richter, Timm Steinbeck
21/// @date
22/// @brief Implementation of HLT logging primitives.
23///
3495cce2 24
85869391 25#include "AliHLTStdIncludes.h"
3495cce2 26#include "AliHLTLogging.h"
a742f6f8 27#include "AliHLTComponentHandler.h"
3cde846d 28#include "TString.h"
fc455fba 29#include "Varargs.h"
30#include <string>
31#include <sstream>
32#include <iostream>
33
c515df4c 34using std::cout;
35using std::cerr;
36using std::endl;
37
b22e91eb 38/** ROOT macro for the implementation of ROOT specific class methods */
a742f6f8 39ClassImp(AliHLTLogging);
3495cce2 40
3495cce2 41AliHLTLogging::AliHLTLogging()
85869391 42 :
66108417 43 fLocalLogFilter(fgLocalLogDefault),
53feaef5 44 fpDefaultKeyword(NULL),
45 fpCurrentKeyword(NULL)
3495cce2 46{
5f5b708b 47 // see header file for class documentation
48 // or
49 // refer to README to build package
50 // or
51 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
85869391 52}
53
54AliHLTLogging::AliHLTLogging(const AliHLTLogging&)
55 :
53feaef5 56 fLocalLogFilter(kHLTLogAll),
85869391 57 fpDefaultKeyword(NULL),
53feaef5 58 fpCurrentKeyword(NULL)
85869391 59{
5f5b708b 60 // see header file for class documentation
85869391 61 HLTFatal("copy constructor untested");
62}
63
64AliHLTLogging& AliHLTLogging::operator=(const AliHLTLogging&)
65{
5f5b708b 66 // see header file for class documentation
85869391 67 HLTFatal("assignment operator untested");
68 return *this;
3495cce2 69}
70
66043029 71ostringstream AliHLTLogging::fgLogstr;
72AliHLTComponentLogSeverity AliHLTLogging::fgGlobalLogFilter=kHLTLogAll;
66108417 73AliHLTComponentLogSeverity AliHLTLogging::fgLocalLogDefault=kHLTLogAll;
66043029 74AliHLTfctLogging AliHLTLogging::fgLoggingFunc=NULL;
a742f6f8 75AliHLTLogging::AliHLTDynamicMessage AliHLTLogging::fgAliLoggingFunc=NULL;
fc455fba 76int AliHLTLogging::fgUseAliLog=1;
3495cce2 77
1e27470a 78TString AliHLTLogging::fgBlackList="";
79TString AliHLTLogging::fgWhiteList="";
80
3495cce2 81AliHLTLogging::~AliHLTLogging()
82{
5f5b708b 83 // see header file for class documentation
3495cce2 84}
85
a742f6f8 86// the array will be grown dynamically, this is just an initial size
66043029 87TArrayC AliHLTLogging::fgAliHLTLoggingTarget(200);
a742f6f8 88// the maximum size of the array
66043029 89const int AliHLTLogging::fgkALIHLTLOGGINGMAXBUFFERSIZE=10000;
90
bb16cc41 91int AliHLTLogging::Init(AliHLTfctLogging pFun)
fa274626 92{
5f5b708b 93 // see header file for class documentation
66043029 94 if (fgLoggingFunc!=NULL && fgLoggingFunc!=pFun) {
95 (*fgLoggingFunc)(NULL/*fParam*/, kHLTLogWarning, "AliHLTLogging::Init", "no key", "overriding previously initialized logging function");
bb16cc41 96 }
66043029 97 fgLoggingFunc=pFun;
fc455fba 98
bb16cc41 99 return 0;
100}
101
a742f6f8 102int AliHLTLogging::InitAliLogTrap(AliHLTComponentHandler* pHandler)
103{
104 // see header file for class documentation
db95fec3 105 // init the AliRoot logging trap
106 // AliLog messages are redirected to PubSub,
a742f6f8 107 int iResult=0;
108 if (pHandler) {
db95fec3 109 // set temporary loglevel of component handler
a742f6f8 110 AliHLTComponentLogSeverity loglevel=pHandler->GetLocalLoggingLevel();
111 pHandler->SetLocalLoggingLevel(kHLTLogError);
db95fec3 112
113 // load library containing AliRoot dependencies and initialization handler
114 pHandler->LoadLibrary(ALILOG_WRAPPER_LIBRARY, 0/* do not activate agents */);
115
116 // restore loglevel
a742f6f8 117 pHandler->SetLocalLoggingLevel(loglevel);
db95fec3 118
119 // find the symbol
120 InitAliDynamicMessageCallback pFunc=(InitAliDynamicMessageCallback)pHandler->FindSymbol(ALILOG_WRAPPER_LIBRARY, "InitAliDynamicMessageCallback");
a742f6f8 121 if (pFunc) {
122 iResult=(*pFunc)();
123 } else {
124 Message(NULL, kHLTLogError, "AliHLTLogging::InitAliLogTrap", "init logging",
125 "can not initialize AliLog callback");
126 iResult=-ENOSYS;
127 }
128 } else {
129 iResult=-EINVAL;
130 }
131
132 return iResult;
133}
134
db95fec3 135int AliHLTLogging::InitAliLogFunc(AliHLTComponentHandler* pHandler)
136{
137 // see header file for class documentation
138 int iResult=0;
139 if (pHandler) {
140 // set temporary loglevel of component handler
141 AliHLTComponentLogSeverity loglevel=pHandler->GetLocalLoggingLevel();
142 pHandler->SetLocalLoggingLevel(kHLTLogError);
143
144 // load library containing AliRoot dependencies and initialization handler
145 pHandler->LoadLibrary(ALILOG_WRAPPER_LIBRARY, 0/* do not activate agents */);
146
147 // restore loglevel
148 pHandler->SetLocalLoggingLevel(loglevel);
149
150 // find the symbol
151 fgAliLoggingFunc=(AliHLTLogging::AliHLTDynamicMessage)pHandler->FindSymbol(ALILOG_WRAPPER_LIBRARY, "AliDynamicMessage");
152 if (fgAliLoggingFunc==NULL) {
153 Message(NULL, kHLTLogError, "AliHLTLogging::InitAliLogFunc", "init logging",
1ecb011a 154 "symbol lookup failure: can not find AliDynamicMessage, switching to HLT logging system");
db95fec3 155 iResult=-ENOSYS;
156 }
157 } else {
158 iResult=-EINVAL;
159 }
160
161 return iResult;
162}
163
fc455fba 164int AliHLTLogging::Message(void *param, AliHLTComponentLogSeverity severity,
165 const char* origin, const char* keyword,
166 const char* message)
5f5b708b 167{
168 // see header file for class documentation
3495cce2 169 int iResult=0;
53feaef5 170 if (param==NULL) {
171 // this is currently just to get rid of the warning "unused parameter"
172 }
fc455fba 173
3495cce2 174 const char* strSeverity="";
175 switch (severity) {
176 case kHLTLogBenchmark:
177 strSeverity="benchmark";
178 break;
179 case kHLTLogDebug:
180 strSeverity="debug";
181 break;
182 case kHLTLogInfo:
183 strSeverity="info";
184 break;
185 case kHLTLogWarning:
186 strSeverity="warning";
187 break;
188 case kHLTLogError:
189 strSeverity="error";
190 break;
191 case kHLTLogFatal:
192 strSeverity="fatal";
193 break;
b2065764 194 case kHLTLogImportant:
195 strSeverity="notify";
196 break;
3495cce2 197 default:
198 break;
199 }
3cde846d 200 TString out="HLT Log ";
201 out+=strSeverity;
d54f579e 202 if (origin && origin[0]!=0) {out+=": <"; out+=origin; out+="> ";}
3cde846d 203 out+=" "; out+=message;
204 if (keyword!=NULL && strcmp(keyword, HLT_DEFAULT_LOG_KEYWORD)!=0) {
205 out+=" ("; out+=keyword; out +=")";
206 }
207 cout << out.Data() << endl;
3495cce2 208 return iResult;
209}
210
a742f6f8 211#if 0
fc455fba 212int AliHLTLogging::AliMessage(AliHLTComponentLogSeverity severity,
66043029 213 const char* originClass, const char* originFunc,
fc455fba 214 const char* file, int line, const char* message)
5f5b708b 215{
216 // see header file for class documentation
3495cce2 217
fc455fba 218 switch (severity) {
219 case kHLTLogBenchmark:
66043029 220 AliLog::Message(AliLog::kInfo, message, "HLT", originClass, originFunc, file, line);
fc455fba 221 break;
222 case kHLTLogDebug:
66043029 223 AliLog::Message(AliLog::kDebug, message, "HLT", originClass, originFunc, file, line);
fc455fba 224 break;
225 case kHLTLogInfo:
66043029 226 AliLog::Message(AliLog::kInfo, message, "HLT", originClass, originFunc, file, line);
fc455fba 227 break;
228 case kHLTLogWarning:
66043029 229 AliLog::Message(AliLog::kWarning, message, "HLT", originClass, originFunc, file, line);
fc455fba 230 break;
231 case kHLTLogError:
66043029 232 AliLog::Message(AliLog::kError, message, "HLT", originClass, originFunc, file, line);
fc455fba 233 break;
234 case kHLTLogFatal:
66043029 235 AliLog::Message(AliLog::kWarning, message, "HLT", originClass, originFunc, file, line);
fc455fba 236 break;
237 default:
238 break;
239 }
240 return 0;
241}
85465857 242#endif
fc455fba 243
d4c23f36 244const char* AliHLTLogging::BuildLogString(const char *format, va_list &ap, bool bAppend)
fc455fba 245{
246 // see header file for class documentation
247
248 int iResult=0;
a59b461e 249#ifdef R__VA_COPY
fc455fba 250 va_list bap;
251 R__VA_COPY(bap, ap);
a59b461e 252#endif //R__VA_COPY
fc455fba 253
254 // take the first argument from the list as format string if no
255 // format was given
256 const char* fmt = format;
257 if (fmt==NULL) fmt=va_arg(ap, const char*);
258
97d2b87a 259 unsigned int iOffset=0;
260 if (bAppend) {
261 iOffset=strlen(fgAliHLTLoggingTarget.GetArray());
262 } else {
263 fgAliHLTLoggingTarget[0]=0;
264 }
fc455fba 265 while (fmt!=NULL) {
97d2b87a 266 iResult=vsnprintf(fgAliHLTLoggingTarget.GetArray()+iOffset, fgAliHLTLoggingTarget.GetSize()-iOffset, fmt, ap);
fc455fba 267 if (iResult==-1)
268 // for compatibility with older version of vsnprintf
66043029 269 iResult=fgAliHLTLoggingTarget.GetSize()*2;
97d2b87a 270 else
271 iResult+=iOffset;
272
273 if (iResult<fgAliHLTLoggingTarget.GetSize())
274 // everything in the limit
fc455fba 275 break;
276
277 // terminate if buffer is already at the limit
66043029 278 if (fgAliHLTLoggingTarget.GetSize()>=fgkALIHLTLOGGINGMAXBUFFERSIZE)
a59b461e 279 {
66043029 280 fgAliHLTLoggingTarget[fgAliHLTLoggingTarget.GetSize()-1]=0;
fc455fba 281 break;
3495cce2 282 }
fc455fba 283
284 // check limitation and grow the buffer
66043029 285 if (iResult>fgkALIHLTLOGGINGMAXBUFFERSIZE) iResult=fgkALIHLTLOGGINGMAXBUFFERSIZE;
286 fgAliHLTLoggingTarget.Set(iResult+1);
fc455fba 287
288 // copy the original list and skip the first argument if this was the format string
a59b461e 289#ifdef R__VA_COPY
fc455fba 290 va_end(ap);
291 R__VA_COPY(ap, bap);
a59b461e 292#else
66043029 293 fgAliHLTLoggingTarget[fgAliHLTLoggingTarget.GetSize()-1]=0;
a59b461e 294 break;
295#endif //R__VA_COPY
fc455fba 296 if (format==NULL) va_arg(ap, const char*);
297 }
a59b461e 298#ifdef R__VA_COPY
fc455fba 299 va_end(bap);
a59b461e 300#endif //R__VA_COPY
fc455fba 301
66043029 302 return fgAliHLTLoggingTarget.GetArray();
3495cce2 303}
304
7efb6418 305const char* AliHLTLogging::SetLogString(const void* p, const char* pfmt, const char *format, ...)
97d2b87a 306{
307 // see header file for class documentation
795a3247 308 if (!p || !pfmt) return NULL;
7efb6418 309 TString formatstr=format;
795a3247 310 TString pstr;
7efb6418 311#ifdef __DEBUG
312 pstr.Form(pfmt, p);
313#endif
314 formatstr.ReplaceAll("_pfmt_", pstr);
97d2b87a 315 va_list args;
316 va_start(args, format);
317
7efb6418 318 const char* message=BuildLogString(formatstr.Data(), args);
97d2b87a 319 va_end(args);
320
321 return message;
322}
323
fc455fba 324int AliHLTLogging::Logging(AliHLTComponentLogSeverity severity,
325 const char* origin, const char* keyword,
326 const char* format, ... )
5f5b708b 327{
328 // see header file for class documentation
85465857 329 int iResult=CheckFilter(severity);
330 if (iResult>0) {
331 va_list args;
332 va_start(args, format);
66043029 333 if (fgLoggingFunc) {
334 iResult = (*fgLoggingFunc)(NULL/*fParam*/, severity, origin, keyword, AliHLTLogging::BuildLogString(format, args ));
85465857 335 } else {
a742f6f8 336 if (fgUseAliLog!=0 && fgAliLoggingFunc!=NULL)
337 iResult=(*fgAliLoggingFunc)(severity, NULL, origin, NULL, 0, AliHLTLogging::BuildLogString(format, args ));
fc455fba 338 else
fc455fba 339 iResult=Message(NULL/*fParam*/, severity, origin, keyword, AliHLTLogging::BuildLogString(format, args ));
85465857 340 }
fc455fba 341 va_end(args);
3495cce2 342 }
85465857 343 return iResult;
3495cce2 344}
345
fc455fba 346int AliHLTLogging::LoggingVarargs(AliHLTComponentLogSeverity severity,
66043029 347 const char* originClass, const char* originFunc,
fc455fba 348 const char* file, int line, ... ) const
3495cce2 349{
5f5b708b 350 // see header file for class documentation
97d2b87a 351 int iResult=0;
5f5b708b 352
97d2b87a 353 va_list args;
354 va_start(args, line);
355
356 iResult=SendMessage(severity, originClass, originFunc, file, line, AliHLTLogging::BuildLogString(NULL, args ));
357 va_end(args);
358
359 return iResult;
360}
361
362int AliHLTLogging::SendMessage(AliHLTComponentLogSeverity severity,
363 const char* originClass, const char* originFunc,
364 const char* file, int line,
365 const char* message) const
366{
367 // see header file for class documentation
368 int iResult=0;
369 const char* separator="";
370 TString origin;
371 if (originClass) {
372 origin+=originClass;
373 separator="::";
374 }
375 if (originFunc) {
376 origin+=separator;
377 origin+=originFunc;
fc455fba 378 }
85465857 379
97d2b87a 380 if (fgLoggingFunc) {
381 iResult=(*fgLoggingFunc)(NULL/*fParam*/, severity, origin.Data(), GetKeyword(), message);
382 } else {
383 if (fgUseAliLog!=0 && fgAliLoggingFunc!=NULL)
384 iResult=(*fgAliLoggingFunc)(severity, originClass, originFunc, file, line, message);
385 else
386 iResult=Message(NULL/*fParam*/, severity, origin.Data(), GetKeyword(), message);
3495cce2 387 }
3495cce2 388 return iResult;
389}
390
8ede8717 391int AliHLTLogging::CheckFilter(AliHLTComponentLogSeverity severity) const
3495cce2 392{
5f5b708b 393 // see header file for class documentation
394
95e36f3d 395 int iResult=severity==kHLTLogNone || ((severity&fgGlobalLogFilter)>0 && (severity&fLocalLogFilter)>0);
3495cce2 396 return iResult;
397}
5f5b708b 398
399void AliHLTLogging::SetGlobalLoggingLevel(AliHLTComponentLogSeverity level)
400{
401 // see header file for class documentation
402
66043029 403 fgGlobalLogFilter=level;
5f5b708b 404}
405
a742f6f8 406AliHLTComponentLogSeverity AliHLTLogging::GetGlobalLoggingLevel()
407{
408 // see header file for class documentation
409
410 return fgGlobalLogFilter;
411}
412
5f5b708b 413void AliHLTLogging::SetLocalLoggingLevel(AliHLTComponentLogSeverity level)
414{
415 // see header file for class documentation
416
417 fLocalLogFilter=level;
418}
a742f6f8 419
420
421AliHLTComponentLogSeverity AliHLTLogging::GetLocalLoggingLevel()
422{
423 // see header file for class documentation
424
425 return fLocalLogFilter;
426}
1e27470a 427
66108417 428void AliHLTLogging::SetLocalLoggingDefault(AliHLTComponentLogSeverity level)
429{
430 // see header file for class documentation
431 fgLocalLogDefault=level;
432}
433
d76bc02a 434int AliHLTLogging::CheckGroup(const char* /*originClass*/) const
1e27470a 435{
436 // see header file for class documentation
437
438 return 1;
439}
440
441int AliHLTLogging::SetBlackList(const char* classnames)
442{
443 // see header file for class documentation
444
445 if (classnames)
446 fgBlackList=classnames;
447 return 0;
448}
449
450int AliHLTLogging::SetWhiteList(const char* classnames)
451{
452 // see header file for class documentation
453
454 if (classnames)
455 fgWhiteList=classnames;
456 return 0;
457}