3 /**************************************************************************
4 * This file is property of and copyright by the ALICE HLT Project *
5 * ALICE Experiment at CERN, All rights reserved. *
7 * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
8 * for The ALICE HLT Project. *
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 **************************************************************************/
19 /** @file AliHLTLogging.cxx
20 @author Matthias Richter, Timm Steinbeck
22 @brief Implementation of HLT logging primitives.
29 #include "AliHLTStdIncludes.h"
30 #include "AliHLTLogging.h"
31 #include "AliHLTComponentHandler.h"
38 /** ROOT macro for the implementation of ROOT specific class methods */
39 ClassImp(AliHLTLogging);
41 AliHLTLogging::AliHLTLogging()
43 //fLocalLogFilter(kHLTLogDefault),
44 fLocalLogFilter(kHLTLogAll),
45 fpDefaultKeyword(NULL),
46 fpCurrentKeyword(NULL)
48 // see header file for class documentation
50 // refer to README to build package
52 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
55 AliHLTLogging::AliHLTLogging(const AliHLTLogging&)
57 fLocalLogFilter(kHLTLogAll),
58 fpDefaultKeyword(NULL),
59 fpCurrentKeyword(NULL)
61 // see header file for class documentation
62 HLTFatal("copy constructor untested");
65 AliHLTLogging& AliHLTLogging::operator=(const AliHLTLogging&)
67 // see header file for class documentation
68 HLTFatal("assignment operator untested");
72 ostringstream AliHLTLogging::fgLogstr;
73 AliHLTComponentLogSeverity AliHLTLogging::fgGlobalLogFilter=kHLTLogAll;
74 AliHLTfctLogging AliHLTLogging::fgLoggingFunc=NULL;
75 AliHLTLogging::AliHLTDynamicMessage AliHLTLogging::fgAliLoggingFunc=NULL;
76 int AliHLTLogging::fgUseAliLog=1;
78 TString AliHLTLogging::fgBlackList="";
79 TString AliHLTLogging::fgWhiteList="";
81 AliHLTLogging::~AliHLTLogging()
83 // see header file for class documentation
86 // the array will be grown dynamically, this is just an initial size
87 TArrayC AliHLTLogging::fgAliHLTLoggingTarget(200);
88 // the maximum size of the array
89 const int AliHLTLogging::fgkALIHLTLOGGINGMAXBUFFERSIZE=10000;
91 int AliHLTLogging::Init(AliHLTfctLogging pFun)
93 // see header file for class documentation
94 if (fgLoggingFunc!=NULL && fgLoggingFunc!=pFun) {
95 (*fgLoggingFunc)(NULL/*fParam*/, kHLTLogWarning, "AliHLTLogging::Init", "no key", "overriding previously initialized logging function");
102 int AliHLTLogging::InitAliLogTrap(AliHLTComponentHandler* pHandler)
104 // see header file for class documentation
107 AliHLTComponentLogSeverity loglevel=pHandler->GetLocalLoggingLevel();
108 pHandler->SetLocalLoggingLevel(kHLTLogError);
109 pHandler->LoadLibrary("libAliHLTUtil.so");
110 pHandler->SetLocalLoggingLevel(loglevel);
111 InitAliDynamicMessageCallback pFunc=(InitAliDynamicMessageCallback)pHandler->FindSymbol("libAliHLTUtil.so", "InitAliDynamicMessageCallback");
115 Message(NULL, kHLTLogError, "AliHLTLogging::InitAliLogTrap", "init logging",
116 "can not initialize AliLog callback");
126 int AliHLTLogging::Message(void *param, AliHLTComponentLogSeverity severity,
127 const char* origin, const char* keyword,
130 // see header file for class documentation
133 // this is currently just to get rid of the warning "unused parameter"
136 const char* strSeverity="";
138 case kHLTLogBenchmark:
139 strSeverity="benchmark";
148 strSeverity="warning";
159 TString out="HLT Log ";
161 if (origin && origin[0]!=0) {out+=": <"; out+=origin; out+="> ";}
162 out+=" "; out+=message;
163 if (keyword!=NULL && strcmp(keyword, HLT_DEFAULT_LOG_KEYWORD)!=0) {
164 out+=" ("; out+=keyword; out +=")";
166 cout << out.Data() << endl;
171 int AliHLTLogging::AliMessage(AliHLTComponentLogSeverity severity,
172 const char* originClass, const char* originFunc,
173 const char* file, int line, const char* message)
175 // see header file for class documentation
178 case kHLTLogBenchmark:
179 AliLog::Message(AliLog::kInfo, message, "HLT", originClass, originFunc, file, line);
182 AliLog::Message(AliLog::kDebug, message, "HLT", originClass, originFunc, file, line);
185 AliLog::Message(AliLog::kInfo, message, "HLT", originClass, originFunc, file, line);
188 AliLog::Message(AliLog::kWarning, message, "HLT", originClass, originFunc, file, line);
191 AliLog::Message(AliLog::kError, message, "HLT", originClass, originFunc, file, line);
194 AliLog::Message(AliLog::kWarning, message, "HLT", originClass, originFunc, file, line);
203 const char* AliHLTLogging::BuildLogString(const char *format, va_list ap)
205 // see header file for class documentation
213 // take the first argument from the list as format string if no
215 const char* fmt = format;
216 if (fmt==NULL) fmt=va_arg(ap, const char*);
218 fgAliHLTLoggingTarget[0]=0;
220 iResult=vsnprintf(fgAliHLTLoggingTarget.GetArray(), fgAliHLTLoggingTarget.GetSize(), fmt, ap);
222 // for compatibility with older version of vsnprintf
223 iResult=fgAliHLTLoggingTarget.GetSize()*2;
224 else if (iResult<fgAliHLTLoggingTarget.GetSize())
227 // terminate if buffer is already at the limit
228 if (fgAliHLTLoggingTarget.GetSize()>=fgkALIHLTLOGGINGMAXBUFFERSIZE)
230 fgAliHLTLoggingTarget[fgAliHLTLoggingTarget.GetSize()-1]=0;
234 // check limitation and grow the buffer
235 if (iResult>fgkALIHLTLOGGINGMAXBUFFERSIZE) iResult=fgkALIHLTLOGGINGMAXBUFFERSIZE;
236 fgAliHLTLoggingTarget.Set(iResult+1);
238 // copy the original list and skip the first argument if this was the format string
243 fgAliHLTLoggingTarget[fgAliHLTLoggingTarget.GetSize()-1]=0;
246 if (format==NULL) va_arg(ap, const char*);
252 return fgAliHLTLoggingTarget.GetArray();
255 int AliHLTLogging::Logging(AliHLTComponentLogSeverity severity,
256 const char* origin, const char* keyword,
257 const char* format, ... )
259 // see header file for class documentation
260 int iResult=CheckFilter(severity);
263 va_start(args, format);
265 iResult = (*fgLoggingFunc)(NULL/*fParam*/, severity, origin, keyword, AliHLTLogging::BuildLogString(format, args ));
267 if (fgUseAliLog!=0 && fgAliLoggingFunc!=NULL)
268 iResult=(*fgAliLoggingFunc)(severity, NULL, origin, NULL, 0, AliHLTLogging::BuildLogString(format, args ));
270 iResult=Message(NULL/*fParam*/, severity, origin, keyword, AliHLTLogging::BuildLogString(format, args ));
277 int AliHLTLogging::LoggingVarargs(AliHLTComponentLogSeverity severity,
278 const char* originClass, const char* originFunc,
279 const char* file, int line, ... ) const
281 // see header file for class documentation
283 if (file==NULL && line==0) {
284 // this is currently just to get rid of the warning "unused parameter"
286 int iResult=1; //CheckFilter(severity); // check moved to makro
288 const char* separator="";
299 va_start(args, line);
302 iResult=(*fgLoggingFunc)(NULL/*fParam*/, severity, origin.Data(), GetKeyword(), AliHLTLogging::BuildLogString(NULL, args ));
304 if (fgUseAliLog!=0 && fgAliLoggingFunc!=NULL)
305 iResult=(*fgAliLoggingFunc)(severity, originClass, originFunc, file, line, AliHLTLogging::BuildLogString(NULL, args ));
307 iResult=Message(NULL/*fParam*/, severity, origin.Data(), GetKeyword(), AliHLTLogging::BuildLogString(NULL, args ));
314 int AliHLTLogging::CheckFilter(AliHLTComponentLogSeverity severity) const
316 // see header file for class documentation
318 int iResult=severity==kHLTLogNone || (severity&fgGlobalLogFilter)>0 && (severity&fLocalLogFilter)>0;
322 void AliHLTLogging::SetGlobalLoggingLevel(AliHLTComponentLogSeverity level)
324 // see header file for class documentation
326 fgGlobalLogFilter=level;
329 AliHLTComponentLogSeverity AliHLTLogging::GetGlobalLoggingLevel()
331 // see header file for class documentation
333 return fgGlobalLogFilter;
336 void AliHLTLogging::SetLocalLoggingLevel(AliHLTComponentLogSeverity level)
338 // see header file for class documentation
340 fLocalLogFilter=level;
344 AliHLTComponentLogSeverity AliHLTLogging::GetLocalLoggingLevel()
346 // see header file for class documentation
348 return fLocalLogFilter;
351 int AliHLTLogging::CheckGroup(const char* originClass) const
353 // see header file for class documentation
358 int AliHLTLogging::SetBlackList(const char* classnames)
360 // see header file for class documentation
363 fgBlackList=classnames;
367 int AliHLTLogging::SetWhiteList(const char* classnames)
369 // see header file for class documentation
372 fgWhiteList=classnames;