-// @(#) $Id$
+//-*- Mode: C++ -*-
+// $Id$
#ifndef ALIHLTLOGGING_H
#define ALIHLTLOGGING_H
-/* This file is property of and copyright by the ALICE HLT Project *
- * ALICE Experiment at CERN, All rights reserved. *
- * See cxx source for full Copyright notice */
+///* This file is property of and copyright by the *
+///* ALICE Experiment at CERN, All rights reserved. *
+///* See cxx source for full Copyright notice */
-/** @file AliHLTLogging.h
- @author Matthias Richter, Timm Steinbeck
- @date
- @brief HLT module logging primitives.
-*/
+/// @file AliHLTLogging.h
+/// @author Matthias Richter, Timm Steinbeck
+/// @date
+/// @brief HLT module logging primitives.
+///
#include "AliHLTDataTypes.h"
#include "AliHLTStdIncludes.h"
/* the logging macros can be used inside methods of classes which inherit from
* AliHLTLogging
*/
-// HLTMessage is not filtered
-#define HLTMessage( ... ) LoggingVarargs(kHLTLogNone, NULL , NULL , __FILE__ , __LINE__ , __VA_ARGS__ )
-
// function name
#if defined(__GNUC__) || defined(__ICC) || defined(__ECC) || defined(__APPLE__)
#define FUNCTIONNAME() __FUNCTION__
#define FUNCTIONNAME() "???"
#endif
+#ifndef ALIHLTLOGGINGVARIADICFREE_H
+// HLTMessage is not filtered
+#define HLTMessage( ... ) LoggingVarargs(kHLTLogNone, NULL , NULL , __FILE__ , __LINE__ , __VA_ARGS__ )
+
// the following macros are filtered by the Global and Local Log Filter
+#define HLTLog( level, ... ) if (CheckFilter(level)) LoggingVarargs(level, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
#define HLTBenchmark( ... ) LoggingVarargs(kHLTLogBenchmark, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
#ifdef __DEBUG
#define HLTDebug( ... ) if (CheckFilter(kHLTLogDebug) && CheckGroup(Class_Name())) LoggingVarargs(kHLTLogDebug, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
#define HLTWarning( ... ) if (CheckFilter(kHLTLogWarning)) LoggingVarargs(kHLTLogWarning, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
#define HLTError( ... ) if (CheckFilter(kHLTLogError)) LoggingVarargs(kHLTLogError, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
#define HLTFatal( ... ) if (CheckFilter(kHLTLogFatal)) LoggingVarargs(kHLTLogFatal, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
+#define HLTImportant( ... ) if (CheckFilter(kHLTLogImportant))LoggingVarargs(kHLTLogImportant,Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , __VA_ARGS__ )
+
+// the same macros are defined variadic free, in that case the message must be complete
+// include AliHLTLoggingVariadicFree.h
+#else //ALIHLTLOGGINGVARIADICFREE_H
+#define HLTMessage( message ) LoggingVarargs(kHLTLogNone, NULL , NULL , __FILE__ , __LINE__ , message )
+#define HLTLog( level, message) if (CheckFilter(level)) LoggingVarargs(level, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
+#define HLTBenchmark( message ) LoggingVarargs(kHLTLogBenchmark, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
+#ifdef __DEBUG
+#define HLTDebug( message ) if (CheckFilter(kHLTLogDebug) && CheckGroup(Class_Name())) LoggingVarargs(kHLTLogDebug, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
+#else
+#define HLTDebug( message )
+#endif
+#define HLTInfo( message ) if (CheckFilter(kHLTLogInfo)) LoggingVarargs(kHLTLogInfo, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
+#define HLTWarning( message ) if (CheckFilter(kHLTLogWarning)) LoggingVarargs(kHLTLogWarning, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
+#define HLTError( message ) if (CheckFilter(kHLTLogError)) LoggingVarargs(kHLTLogError, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
+#define HLTFatal( message ) if (CheckFilter(kHLTLogFatal)) LoggingVarargs(kHLTLogFatal, Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
+#define HLTImportant( message ) if (CheckFilter(kHLTLogImportant))LoggingVarargs(kHLTLogImportant,Class_Name() , FUNCTIONNAME() , __FILE__ , __LINE__ , message )
+#endif //ALIHLTLOGGINGVARIADICFREE_H
// helper macro to set the keyword
#define HLTLogKeyword(a) AliHLTKeyword hltlogTmpkey(this, a)
#define HLT_DEFAULT_LOG_KEYWORD "no key"
+/**
+ * @class AliHLTLogging
+ * Basic logging class. All classes inherit the besic HLT logging functionality.
+ * Logging levels are controlled by a global logging filter and a local logging
+ * filter.
+ *
+ * @section alihlt_logging_levels Logging Levels
+ * Logging levels are switched by a bit pattern, AliHLTComponentLogSeverity {
+ * - ::kHLTLogNone no logging (0)
+ * - ::kHLTLogBenchmark benchmark messages (0x1)
+ * - ::kHLTLogDebug debug messages (0x2)
+ * - ::kHLTLogInfo info messages (0x4)
+ * - ::kHLTLogWarning warning messages (0x8)
+ * - ::kHLTLogError error messages (0x10)
+ * - ::kHLTLogFatal fatal error messages (0x20)
+ * - ::kHLTLogImportant few important messages not to be filtered out (0x40)
+ * - ::kHLTLogAll special value to enable all messages (0x7f)
+ * - ::kHLTLogDefault the default logging level: Warning, Error, Fatal, Important (0x79)
+ *
+ * @section alihlt_logging_filter Logging Filters
+ * The class provides a global and a local logging filter, the AND beween both
+ * defines whether a message is printed or not.
+ *
+ * The global filter is by default set to ::kHLTLogAll. Please note that AliHLTSystem
+ * changes the global logging level to ::kHLTLogDefault. The global filter can be
+ * adjusted by means of SetGlobalLoggingLevel().
+ *
+ * The local filter is set to ::kHLTLogAll and can be adjusted by
+ * SetLocalLoggingLevel(). The default can be changed for all objects by
+ * SetLocalLoggingDefault(). Please note that a change of the default level only
+ * applies to objects generated after the change of the default.
+ *
+ * @section alihlt_logging_external Redirection
+ * - external logging function
+ * - keyword
+ *
+ * @section alihlt_logging_aliroot AliRoot Redirection
+ * - switching of redirection
+ * - logging options in AliSimulation/AliReconstruction
+ *
+ * @ingroup alihlt_component
+ */
class AliHLTLogging {
public:
AliHLTLogging();
/**
* Set a temporary keyword
+ * Keywords need to be static const strings, the class handles only
+ * pointers and assumes the strings to be persistent.
* returns the old key value
*/
const char* SetKeyword(const char* keyword)
*/
int Logging( AliHLTComponentLogSeverity severity, const char* origin, const char* keyword, const char* message, ... );
- /*
+ /**
* Logging function with two origin parameters, used by the log macros
*/
- int LoggingVarargs(AliHLTComponentLogSeverity severity,
- const char* originClass, const char* originFunc,
- const char* file, int line, ... ) const;
+ virtual int LoggingVarargs(AliHLTComponentLogSeverity severity,
+ const char* originClass, const char* originFunc,
+ const char* file, int line, ... ) const;
+
+ /**
+ * Send formatted string to the different channels
+ */
+ int SendMessage(AliHLTComponentLogSeverity severity,
+ const char* originClass, const char* originFunc,
+ const char* file, int line,
+ const char* message) const;
/**
* Evaluate the group of the debug message from the class name.
*/
virtual void SetLocalLoggingLevel(AliHLTComponentLogSeverity level);
+ /**
+ * Set local logging default
+ * Default logging filter for individual objects.
+ */
+ static void SetLocalLoggingDefault(AliHLTComponentLogSeverity level);
+
+ /**
+ * Get default setting for local logging filter for individual objects.
+ */
+ static AliHLTComponentLogSeverity GetLocalLoggingDefault() { return fgLocalLogDefault; }
+
/**
* Get local logging level
* logging filter for individual object
* Build the log string from format specifier and variadac arguments
* @param format format string of printf style
* @param ap opened and initialized argument list
+ * @param bAppend append to current content
* @return const char string with the formatted message
*/
- static const char* BuildLogString(const char *format, va_list ap);
+ static const char* BuildLogString(const char *format, va_list &ap, bool bAppend=false);
+
+ /**
+ * Set the log string from format specifier and from variable arguments.
+ * @param format format string of printf style
+ * @return const char string with the formatted message
+ */
+ static const char* SetLogString(const void* p, const char* pfmt, const char *format, ... );
/**
* Get parameter given by the external caller.
static AliHLTComponentLogSeverity fgGlobalLogFilter; // see above
/** the local logging filter for one class */
AliHLTComponentLogSeverity fLocalLogFilter; // see above
+ /** the global logging filter */
+ static AliHLTComponentLogSeverity fgLocalLogDefault; // see above
/** logging callback from the framework */
static AliHLTfctLogging fgLoggingFunc; // see above
/** default keyword */
/** groups of classes not to print debug messages */
static TString fgWhiteList; //! transient
- ClassDef(AliHLTLogging, 3)
+ ClassDef(AliHLTLogging, 0)
};
/* the class AliHLTKeyword is a simple helper class used by the HLTLogKeyword macro
* HLTLogKeyword("a keyword") creates an object of AliHLTKeyword which sets the keyword for the logging class
* the object is destroyed automatically when the current scope is left and so the keyword is set
- * to the original value
+ * to the original value. Please note that all keywords need to be static strings, only pointyers
+ * are handled and the strings required to ber persistent.
*/
class AliHLTKeyword {
public:
{
}
- AliHLTKeyword(AliHLTLogging* parent, const char* keyword)
+ AliHLTKeyword(const AliHLTLogging* parent, const char* keyword)
:
- fpParent(parent),
+ fpParent(const_cast<AliHLTLogging*>(parent)),
fpOriginal(NULL)
{
- if (parent) {
+ // the const cast is on purpose in order to be allowed to use
+ // HLTLogKeyword from const member functions
+ if (fpParent) {
fpOriginal=fpParent->SetKeyword(keyword);
}
}
- AliHLTKeyword(const AliHLTKeyword& kw)
- :
- fpParent(kw.fpParent),
- fpOriginal(kw.fpOriginal)
- {
- }
-
- AliHLTKeyword& operator=(const AliHLTKeyword& kw)
- {
- fpParent=kw.fpParent;
- fpOriginal=kw.fpOriginal;
- return *this;
- }
-
~AliHLTKeyword()
{
if (fpParent) {
}
private:
+ /// copy constructor prohibited
+ AliHLTKeyword(const AliHLTKeyword& kw);
+ /// assignment operator prohibited
+ AliHLTKeyword& operator=(const AliHLTKeyword& kw);
+
AliHLTLogging* fpParent; //! transient
const char* fpOriginal; //! transient
};