]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/BASE/AliHLTLogging.cxx
added new helper components to libAliHLTUtil (EsdCollector and AliHLTOUTPublisher...
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTLogging.cxx
CommitLineData
fc455fba 1// @(#) $Id$
3495cce2 2
3/**************************************************************************
9be2600f 4 * This file is property of and copyright by the ALICE HLT Project *
5 * ALICE Experiment at CERN, All rights reserved. *
3495cce2 6 * *
9be2600f 7 * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
8 * for The ALICE HLT Project. *
3495cce2 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 **************************************************************************/
18
b22e91eb 19/** @file AliHLTLogging.cxx
20 @author Matthias Richter, Timm Steinbeck
21 @date
22 @brief Implementation of HLT logging primitives.
23*/
3495cce2 24
0c0c9d99 25#if __GNUC__>= 3
3495cce2 26using namespace std;
27#endif
28
85869391 29#include "AliHLTStdIncludes.h"
3495cce2 30#include "AliHLTLogging.h"
a742f6f8 31#include "AliHLTComponentHandler.h"
3cde846d 32#include "TString.h"
fc455fba 33#include "Varargs.h"
34#include <string>
35#include <sstream>
36#include <iostream>
37
b22e91eb 38/** ROOT macro for the implementation of ROOT specific class methods */
a742f6f8 39ClassImp(AliHLTLogging);
3495cce2 40
3495cce2 41AliHLTLogging::AliHLTLogging()
85869391 42 :
85869391 43 //fLocalLogFilter(kHLTLogDefault),
53feaef5 44 fLocalLogFilter(kHLTLogAll),
45 fpDefaultKeyword(NULL),
46 fpCurrentKeyword(NULL)
3495cce2 47{
5f5b708b 48 // see header file for class documentation
49 // or
50 // refer to README to build package
51 // or
52 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
85869391 53}
54
55AliHLTLogging::AliHLTLogging(const AliHLTLogging&)
56 :
53feaef5 57 fLocalLogFilter(kHLTLogAll),
85869391 58 fpDefaultKeyword(NULL),
53feaef5 59 fpCurrentKeyword(NULL)
85869391 60{
5f5b708b 61 // see header file for class documentation
85869391 62 HLTFatal("copy constructor untested");
63}
64
65AliHLTLogging& AliHLTLogging::operator=(const AliHLTLogging&)
66{
5f5b708b 67 // see header file for class documentation
85869391 68 HLTFatal("assignment operator untested");
69 return *this;
3495cce2 70}
71
66043029 72ostringstream AliHLTLogging::fgLogstr;
73AliHLTComponentLogSeverity AliHLTLogging::fgGlobalLogFilter=kHLTLogAll;
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",
154 "symbol lookp failure: can not find AliDynamicMessage, switching to HLT logging system");
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
244const char* AliHLTLogging::BuildLogString(const char *format, va_list ap)
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
66043029 259 fgAliHLTLoggingTarget[0]=0;
fc455fba 260 while (fmt!=NULL) {
66043029 261 iResult=vsnprintf(fgAliHLTLoggingTarget.GetArray(), fgAliHLTLoggingTarget.GetSize(), fmt, ap);
fc455fba 262 if (iResult==-1)
263 // for compatibility with older version of vsnprintf
66043029 264 iResult=fgAliHLTLoggingTarget.GetSize()*2;
265 else if (iResult<fgAliHLTLoggingTarget.GetSize())
fc455fba 266 break;
267
268 // terminate if buffer is already at the limit
66043029 269 if (fgAliHLTLoggingTarget.GetSize()>=fgkALIHLTLOGGINGMAXBUFFERSIZE)
a59b461e 270 {
66043029 271 fgAliHLTLoggingTarget[fgAliHLTLoggingTarget.GetSize()-1]=0;
fc455fba 272 break;
3495cce2 273 }
fc455fba 274
275 // check limitation and grow the buffer
66043029 276 if (iResult>fgkALIHLTLOGGINGMAXBUFFERSIZE) iResult=fgkALIHLTLOGGINGMAXBUFFERSIZE;
277 fgAliHLTLoggingTarget.Set(iResult+1);
fc455fba 278
279 // copy the original list and skip the first argument if this was the format string
a59b461e 280#ifdef R__VA_COPY
fc455fba 281 va_end(ap);
282 R__VA_COPY(ap, bap);
a59b461e 283#else
66043029 284 fgAliHLTLoggingTarget[fgAliHLTLoggingTarget.GetSize()-1]=0;
a59b461e 285 break;
286#endif //R__VA_COPY
fc455fba 287 if (format==NULL) va_arg(ap, const char*);
288 }
a59b461e 289#ifdef R__VA_COPY
fc455fba 290 va_end(bap);
a59b461e 291#endif //R__VA_COPY
fc455fba 292
66043029 293 return fgAliHLTLoggingTarget.GetArray();
3495cce2 294}
295
fc455fba 296int AliHLTLogging::Logging(AliHLTComponentLogSeverity severity,
297 const char* origin, const char* keyword,
298 const char* format, ... )
5f5b708b 299{
300 // see header file for class documentation
85465857 301 int iResult=CheckFilter(severity);
302 if (iResult>0) {
303 va_list args;
304 va_start(args, format);
66043029 305 if (fgLoggingFunc) {
306 iResult = (*fgLoggingFunc)(NULL/*fParam*/, severity, origin, keyword, AliHLTLogging::BuildLogString(format, args ));
85465857 307 } else {
a742f6f8 308 if (fgUseAliLog!=0 && fgAliLoggingFunc!=NULL)
309 iResult=(*fgAliLoggingFunc)(severity, NULL, origin, NULL, 0, AliHLTLogging::BuildLogString(format, args ));
fc455fba 310 else
fc455fba 311 iResult=Message(NULL/*fParam*/, severity, origin, keyword, AliHLTLogging::BuildLogString(format, args ));
85465857 312 }
fc455fba 313 va_end(args);
3495cce2 314 }
85465857 315 return iResult;
3495cce2 316}
317
fc455fba 318int AliHLTLogging::LoggingVarargs(AliHLTComponentLogSeverity severity,
66043029 319 const char* originClass, const char* originFunc,
fc455fba 320 const char* file, int line, ... ) const
3495cce2 321{
5f5b708b 322 // see header file for class documentation
323
fc455fba 324 if (file==NULL && line==0) {
325 // this is currently just to get rid of the warning "unused parameter"
326 }
1e27470a 327 int iResult=1; //CheckFilter(severity); // check moved to makro
85465857 328 if (iResult>0) {
85465857 329 const char* separator="";
fc455fba 330 TString origin;
66043029 331 if (originClass) {
332 origin+=originClass;
85465857 333 separator="::";
3495cce2 334 }
66043029 335 if (originFunc) {
fc455fba 336 origin+=separator;
66043029 337 origin+=originFunc;
3495cce2 338 }
85465857 339 va_list args;
fc455fba 340 va_start(args, line);
85465857 341
66043029 342 if (fgLoggingFunc) {
343 iResult=(*fgLoggingFunc)(NULL/*fParam*/, severity, origin.Data(), GetKeyword(), AliHLTLogging::BuildLogString(NULL, args ));
85465857 344 } else {
a742f6f8 345 if (fgUseAliLog!=0 && fgAliLoggingFunc!=NULL)
346 iResult=(*fgAliLoggingFunc)(severity, originClass, originFunc, file, line, AliHLTLogging::BuildLogString(NULL, args ));
fc455fba 347 else
fc455fba 348 iResult=Message(NULL/*fParam*/, severity, origin.Data(), GetKeyword(), AliHLTLogging::BuildLogString(NULL, args ));
85465857 349 }
350 va_end(args);
3495cce2 351 }
3495cce2 352 return iResult;
353}
354
8ede8717 355int AliHLTLogging::CheckFilter(AliHLTComponentLogSeverity severity) const
3495cce2 356{
5f5b708b 357 // see header file for class documentation
358
66043029 359 int iResult=severity==kHLTLogNone || (severity&fgGlobalLogFilter)>0 && (severity&fLocalLogFilter)>0;
3495cce2 360 return iResult;
361}
5f5b708b 362
363void AliHLTLogging::SetGlobalLoggingLevel(AliHLTComponentLogSeverity level)
364{
365 // see header file for class documentation
366
66043029 367 fgGlobalLogFilter=level;
5f5b708b 368}
369
a742f6f8 370AliHLTComponentLogSeverity AliHLTLogging::GetGlobalLoggingLevel()
371{
372 // see header file for class documentation
373
374 return fgGlobalLogFilter;
375}
376
5f5b708b 377void AliHLTLogging::SetLocalLoggingLevel(AliHLTComponentLogSeverity level)
378{
379 // see header file for class documentation
380
381 fLocalLogFilter=level;
382}
a742f6f8 383
384
385AliHLTComponentLogSeverity AliHLTLogging::GetLocalLoggingLevel()
386{
387 // see header file for class documentation
388
389 return fLocalLogFilter;
390}
1e27470a 391
d76bc02a 392int AliHLTLogging::CheckGroup(const char* /*originClass*/) const
1e27470a 393{
394 // see header file for class documentation
395
396 return 1;
397}
398
399int AliHLTLogging::SetBlackList(const char* classnames)
400{
401 // see header file for class documentation
402
403 if (classnames)
404 fgBlackList=classnames;
405 return 0;
406}
407
408int AliHLTLogging::SetWhiteList(const char* classnames)
409{
410 // see header file for class documentation
411
412 if (classnames)
413 fgWhiteList=classnames;
414 return 0;
415}