version 1.1.2.3, 2001/08/01 23:13:01
|
version 1.28, 2007/03/16 17:16:50
|
|
|
//%///////////////////////////////////////////////////////////////////////////// |
//%2006//////////////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001 BMC Software, Hewlett-Packard Company, IBM, |
// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development |
// The Open Group, Tivoli Systems |
// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. |
|
// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.; |
|
// IBM Corp.; EMC Corporation, The Open Group. |
|
// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.; |
|
// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. |
|
// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
|
// EMC Corporation; VERITAS Software Corporation; The Open Group. |
|
// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
|
// EMC Corporation; Symantec Corporation; The Open Group. |
// | // |
// Permission is hereby granted, free of charge, to any person obtaining a copy | // Permission is hereby granted, free of charge, to any person obtaining a copy |
// of this software and associated documentation files (the "Software"), to | // of this software and associated documentation files (the "Software"), to |
|
|
// | // |
//============================================================================== | //============================================================================== |
// | // |
// Author: Sushma Fernandes, Hewlett-Packard Company (sushma_fernandes@hp.com) |
|
// |
|
// Modified By: |
|
// |
|
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
#ifndef Pegasus_Tracer_h | #ifndef Pegasus_Tracer_h |
#define Pegasus_Tracer_h | #define Pegasus_Tracer_h |
| |
#include <stdarg.h> | #include <stdarg.h> |
#include <fstream> |
|
#include <Pegasus/Common/String.h> | #include <Pegasus/Common/String.h> |
#include <Pegasus/Common/System.h> | #include <Pegasus/Common/System.h> |
#include <Pegasus/Common/Logger.h> | #include <Pegasus/Common/Logger.h> |
|
#include <Pegasus/Common/InternalException.h> |
#include <Pegasus/Common/TraceComponents.h> | #include <Pegasus/Common/TraceComponents.h> |
#include <Pegasus/Common/TraceFileHandler.h> | #include <Pegasus/Common/TraceFileHandler.h> |
|
#include <Pegasus/Common/Linkage.h> |
|
#include <Pegasus/Common/AutoPtr.h> |
| |
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
/** Tracer implements tracing of messages to a defined file |
/** Token used for tracing functions. |
*/ | */ |
|
struct TracerToken |
|
{ |
|
Uint32 component; |
|
const char* method; |
|
}; |
| |
|
/** Tracer implements tracing of messages to a defined file |
|
*/ |
class PEGASUS_COMMON_LINKAGE Tracer | class PEGASUS_COMMON_LINKAGE Tracer |
{ | { |
public: | public: |
|
|
static const Uint32 LEVEL3; | static const Uint32 LEVEL3; |
static const Uint32 LEVEL4; | static const Uint32 LEVEL4; |
| |
// PEGASUS_REMOVE_TRACE defines the compile time inclusion of the Trace |
|
// interfaces. If defined the interfaces map to empty functions |
|
|
|
#ifdef PEGASUS_REMOVE_TRACE |
|
|
|
inline static void trace( |
|
const Uint32 traceComponent, |
|
const Uint32 traceLevel, |
|
const char *fmt, |
|
...) |
|
{ |
|
// empty function |
|
} |
|
|
|
inline static void trace( |
|
const char* fileName, |
|
const Uint32 lineNum, |
|
const Uint32 traceComponent, |
|
const Uint32 traceLevel, |
|
const char* fmt, |
|
...) |
|
{ |
|
// empty function |
|
} |
|
|
|
#else |
|
|
|
/** Traces the given message | /** Traces the given message |
@param traceComponent component being traced | @param traceComponent component being traced |
@param traceLevel trace level of the trace message |
@param level trace level of the trace message |
@param *fmt printf style format string | @param *fmt printf style format string |
@param ... variable argument list | @param ... variable argument list |
*/ | */ |
inline static void trace( |
static void trace( |
const Uint32 traceComponent, | const Uint32 traceComponent, |
const Uint32 traceLevel, |
const Uint32 level, |
const char *fmt, | const char *fmt, |
...) |
...); |
{ |
|
va_list argList; |
|
|
|
va_start(argList,fmt); |
|
_trace(traceComponent,traceLevel,fmt,argList); |
|
va_end(argList); |
|
} |
|
| |
/** Traces the given message. Overloaded to include the filename and | /** Traces the given message. Overloaded to include the filename and |
the line number of trace origin. | the line number of trace origin. |
@param fileName filename of the trace originator | @param fileName filename of the trace originator |
@param lineNum line number of the trace originator | @param lineNum line number of the trace originator |
@param traceComponent component being traced | @param traceComponent component being traced |
@param traceLevel trace level of the trace message |
@param level trace level of the trace message |
@param *fmt printf style format string | @param *fmt printf style format string |
@param ... variable argument list | @param ... variable argument list |
*/ | */ |
inline static void trace( |
static void trace( |
const char* fileName, | const char* fileName, |
const Uint32 lineNum, | const Uint32 lineNum, |
const Uint32 traceComponent, | const Uint32 traceComponent, |
const Uint32 traceLevel, |
const Uint32 level, |
const char* fmt, | const char* fmt, |
...) |
...); |
{ |
|
va_list argList; |
|
|
|
va_start(argList,fmt); |
|
_trace(fileName,lineNum,traceComponent,traceLevel,fmt,argList); |
|
va_end(argList); |
|
} |
|
|
|
#endif |
|
|
|
// End of PEGASUS_REMOVE_TRACE |
|
| |
/** Traces method entry. |
/** Traces the given string. Overloaded to include the filename |
|
and line number of trace origin. |
@param fileName filename of the trace originator | @param fileName filename of the trace originator |
@param lineNum line number of the trace originator | @param lineNum line number of the trace originator |
@param traceComponent component being traced | @param traceComponent component being traced |
@param methodName method being traced |
@param level trace level of the trace message |
|
@param string the string to be traced |
*/ | */ |
inline static void traceEnter( |
static void traceString( |
const char* fileName, | const char* fileName, |
const Uint32 lineNum, | const Uint32 lineNum, |
const Uint32 traceComponent, | const Uint32 traceComponent, |
const char* methodName) |
const Uint32 level, |
{ |
const String& string); |
_traceEnter( fileName, lineNum, traceComponent, "%s %s", |
|
_FUNC_ENTER_MSG, methodName); |
|
} |
|
| |
/** Traces method exit. |
/** Traces the given character string. |
|
Overloaded to include the filename |
|
and line number of trace origin. |
@param fileName filename of the trace originator | @param fileName filename of the trace originator |
@param lineNum line number of the trace originator | @param lineNum line number of the trace originator |
@param traceComponent component being traced | @param traceComponent component being traced |
@param methodName method being traced |
@param level trace level of the trace message |
|
@param cstring the character string to be traced |
*/ | */ |
inline static void traceExit( |
static void traceCString( |
const char* fileName, | const char* fileName, |
const Uint32 lineNum, | const Uint32 lineNum, |
const Uint32 traceComponent, | const Uint32 traceComponent, |
const char* methodName) |
const Uint32 level, |
{ |
const char* cstring); |
_traceExit( fileName, lineNum, traceComponent, "%s %s", |
|
_FUNC_EXIT_MSG, methodName); |
/** Traces the message in the given CIMException object. The message |
} |
written to the trace file will include the source filename and |
|
line number of the CIMException originator. |
|
@param traceComponent component being traced |
|
@param level trace level of the trace message |
|
@param CIMException the CIMException to be traced. |
|
*/ |
|
static void traceCIMException( |
|
const Uint32 traceComponent, |
|
const Uint32 level, |
|
const CIMException& cimException); |
| |
/** Set the trace file to the given file | /** Set the trace file to the given file |
@param traceFile full path of the trace file | @param traceFile full path of the trace file |
@return 0 if the filepath is valid | @return 0 if the filepath is valid |
1 if an error occurs while opening the file in |
1 if the traceFile is an empty string or |
append mode |
if an error occurs while opening the file |
|
in append mode |
*/ | */ |
static Uint32 setTraceFile(const char* traceFile); | static Uint32 setTraceFile(const char* traceFile); |
| |
/** Set the trace level to the given level | /** Set the trace level to the given level |
@param traceLevel trace level to be set |
@param level trace level to be set |
@return 0 if trace level is valid | @return 0 if trace level is valid |
1 if trace level is invalid | 1 if trace level is invalid |
*/ | */ |
static Uint32 setTraceLevel(const Uint32 traceLevel); |
static Uint32 setTraceLevel(const Uint32 level); |
| |
/** Set components to be traced | /** Set components to be traced |
@param traceComponents list of components to be traced, components |
@param traceComponents list of components to be traced, |
should be separated by ',' |
components should be separated by ',' |
|
*/ |
|
static void setTraceComponents( |
|
const String& traceComponents); |
|
|
|
/** Traces method entry. |
|
@param token TracerToken |
|
@param fileName filename of the trace originator |
|
@param lineNum line number of the trace originator |
|
@param traceComponent component being traced |
|
@param methodName method being traced |
|
*/ |
|
static void traceEnter( |
|
TracerToken& token, |
|
const char* file, |
|
size_t line, |
|
Uint32 component, |
|
const char* method); |
|
|
|
/** Traces method exit. |
|
@param token TracerToken containing component and method |
|
@param fileName filename of the trace originator |
|
@param lineNum line number of the trace originator |
|
*/ |
|
static void traceExit( |
|
TracerToken& token, |
|
const char* file, |
|
size_t line); |
|
|
|
/** Validates the File Path for the trace File |
|
@param filePath full path of the file |
|
@return 1 if the file path is valid |
|
0 if the file path is invalid |
|
*/ |
|
static Boolean isValidFileName(const char* filePath); |
|
|
|
/** Validates the trace components |
|
@param traceComponents comma separated list of trace components |
|
@return 1 if the components are valid |
|
0 if one or more components are invalid |
|
*/ |
|
static Boolean isValidComponents(const String& traceComponents); |
|
|
|
/** Validates the trace components |
|
@param traceComponents comma separated list of trace components |
|
@param invalidComponents comma separated list of invalid components |
|
@return 1 if the components are valid |
|
0 if one or more components are invalid |
|
*/ |
|
static Boolean isValidComponents( |
|
const String& traceComponents, |
|
String& invalidComponents); |
|
|
|
/** Specify the name of the module being traced. If non-empty, this |
|
value is used as an extension to the name of the trace file. |
|
@param moduleName Name of the module being traced. |
|
*/ |
|
static void setModuleName(const String& moduleName); |
|
|
|
/** |
*/ | */ |
static void setTraceComponents(String traceComponents); |
static Boolean isTraceOn() { return _traceOn; } |
| |
private: | private: |
| |
|
/** A static single indicator if tracing is turned on allowing to |
|
determine the state of trace quickly without many instructions. |
|
Used to wrap the public static trace interface methods to avoid |
|
obsolete calls when tracing is turned off. |
|
*/ |
|
static Boolean _traceOn; |
|
|
static const char _COMPONENT_SEPARATOR; | static const char _COMPONENT_SEPARATOR; |
static const Uint32 _NUM_COMPONENTS; | static const Uint32 _NUM_COMPONENTS; |
static const Uint32 _STRLEN_MAX_UNSIGNED_INT; | static const Uint32 _STRLEN_MAX_UNSIGNED_INT; |
Boolean* _traceComponentMask; |
static const Uint32 _STRLEN_MAX_PID_TID; |
|
static const Boolean _SUCCESS; |
|
static const Boolean _FAILURE; |
|
AutoArrayPtr<Boolean> _traceComponentMask; |
Uint32 _traceLevelMask; | Uint32 _traceLevelMask; |
TraceFileHandler* _traceHandler; |
AutoPtr<TraceFileHandler> _traceHandler; |
|
String _moduleName; |
static Tracer* _tracerInstance; | static Tracer* _tracerInstance; |
| |
// Message Strings for fucntion Entry and Exit |
// Message Strings for function Entry and Exit |
static const char _FUNC_ENTER_MSG[]; |
static const char _METHOD_ENTER_MSG[]; |
static const char _FUNC_EXIT_MSG[]; |
static const char _METHOD_EXIT_MSG[]; |
| |
// Message Strings for Logger | // Message Strings for Logger |
static const char _LOG_MSG1[]; |
static const char _LOG_MSG[]; |
static const char _LOG_MSG2[]; |
|
| |
// Checks if trace is enabled for the given component and trace level | // Checks if trace is enabled for the given component and trace level |
// @param traceComponent component being traced | // @param traceComponent component being traced |
// @param traceLevel level of the trace message |
// @param level level of the trace message |
// @return 0 if the component and level are not enabled | // @return 0 if the component and level are not enabled |
// 1 if the component and level are enabled | // 1 if the component and level are enabled |
static Boolean _isTraceEnabled( | static Boolean _isTraceEnabled( |
const Uint32 traceComponent, | const Uint32 traceComponent, |
const Uint32 traceLevel); |
const Uint32 level); |
| |
// Traces the given message | // Traces the given message |
// @param traceComponent component being traced | // @param traceComponent component being traced |
// @param traceLevel level of the trace message |
|
// @param *fmt printf style format string | // @param *fmt printf style format string |
// @param argList variable argument list | // @param argList variable argument list |
static void _trace( | static void _trace( |
const Uint32 traceComponent, | const Uint32 traceComponent, |
const Uint32 traceLevel, |
|
const char* fmt, | const char* fmt, |
va_list argList); | va_list argList); |
| |
// Traces the given message. Overloaded to include the file name and the | // Traces the given message. Overloaded to include the file name and the |
// line number as one of the parameters. | // line number as one of the parameters. |
// @param traceComponent component being traced | // @param traceComponent component being traced |
// @param traceLevel level of the trace message |
|
// @param message message header (file name:line number) | // @param message message header (file name:line number) |
// @param *fmt printf style format string | // @param *fmt printf style format string |
// @param argList variable argument list | // @param argList variable argument list |
|
|
const char* fileName, | const char* fileName, |
const Uint32 lineNum, | const Uint32 lineNum, |
const Uint32 traceComponent, | const Uint32 traceComponent, |
const Uint32 traceLevel, |
|
const char* fmt, | const char* fmt, |
va_list argList); | va_list argList); |
| |
// Called by all the trace interfaces to log message to the |
// Traces a given character string. Overloaded to include the filename |
// trace file |
// and line number of trace origin. |
// @param fileName filename of the trace originator | // @param fileName filename of the trace originator |
// @param lineNum line number of the trace originator | // @param lineNum line number of the trace originator |
// @param traceComponent component being traced | // @param traceComponent component being traced |
|
// @param cstring the character string to be traced |
|
// |
|
static void _traceCString( |
|
const char* fileName, |
|
const Uint32 lineNum, |
|
const Uint32 traceComponent, |
|
const char* cstring); |
|
|
|
// Traces the message in the given CIMException object. The message |
|
// to be written to the trace file will include the source filename and |
|
// line number of the CIMException originator. |
|
// @param traceComponent component being traced |
|
// @param CIMException the CIMException to be traced. |
|
// |
|
static void _traceCIMException( |
|
const Uint32 traceComponent, |
|
const CIMException& cimException); |
|
|
|
// Called by all the trace interfaces to log message |
|
// consisting of a single character string to the trace file |
|
// @param traceComponent component being traced |
|
// @param cstring the string to be traced |
|
static void _traceCString( |
|
const Uint32 traceComponent, |
|
const char* message, |
|
const char* cstring); |
|
|
|
// Called by all the trace interfaces to log message |
|
// with variable number of arguments to the trace file |
|
// @param traceComponent component being traced |
// @param *fmt printf style format string | // @param *fmt printf style format string |
// @param argList variable argument list | // @param argList variable argument list |
static void _trace( | static void _trace( |
|
|
const char* fmt, | const char* fmt, |
va_list argList); | va_list argList); |
| |
// Traces method enter |
// Traces method enter/exit |
// @param fileName filename of the trace originator | // @param fileName filename of the trace originator |
// @param lineNum line number of the trace originator | // @param lineNum line number of the trace originator |
// @param traceComponent component being traced | // @param traceComponent component being traced |
// @param *fmt printf style format string |
// @param method name of the method |
// @param ... variable argument list |
static void _traceMethod( |
static void _traceEnter( |
|
const char* fileName, |
|
const Uint32 lineNum, |
|
const Uint32 traceComponent, |
|
const char* fmt, |
|
...); |
|
|
|
// Traces method exit |
|
// @param fileName filename of the trace originator |
|
// @param traceComponent component being traced |
|
// @param *fmt printf style format string |
|
// @param ... variable argument list |
|
static void _traceExit( |
|
const char* fileName, | const char* fileName, |
const Uint32 lineNum, | const Uint32 lineNum, |
const Uint32 traceComponent, | const Uint32 traceComponent, |
const char* fmt, |
const char* methodEntryExit, |
...); |
const char* method); |
| |
// Tracer constructor | // Tracer constructor |
// Constructor is private to prevent construction of Tracer objects | // Constructor is private to prevent construction of Tracer objects |
|
|
static Tracer* _getInstance(); | static Tracer* _getInstance(); |
}; | }; |
| |
// Define the macros for method entry/exit |
//============================================================================== |
|
// |
|
// PEGASUS_REMOVE_TRACE defines the compile time inclusion of the Trace |
|
// interfaces. If defined the interfaces map to empty functions. |
|
// |
|
//============================================================================== |
|
|
#ifdef PEGASUS_REMOVE_TRACE | #ifdef PEGASUS_REMOVE_TRACE |
#define PEG_FUNC_ENTER(traceComponent,methodName) |
|
#define PEG_FUNC_EXIT(traceComponent,methodName) |
|
#else |
|
/** Macro for tracing method entry |
|
@param traceComponent component being traced |
|
@param methodName name of the method |
|
*/ |
|
#define PEG_FUNC_ENTER(traceComponent,methodName) \ |
|
Tracer::traceEnter(__FILE__, __LINE__,traceComponent,methodName) |
|
| |
/** Macro for tracing method exit |
inline void Tracer::trace( |
@param traceComponent component being traced |
const Uint32 traceComponent, |
@param methodName name of the method |
const Uint32 level, |
*/ |
const char *fmt, |
#define PEG_FUNC_EXIT(traceComponent,methodName) \ |
...) |
Tracer::traceExit(__FILE__,__LINE__,traceComponent,methodName) |
{ |
|
// empty function |
|
} |
|
|
|
inline void Tracer::trace( |
|
const char* fileName, |
|
const Uint32 lineNum, |
|
const Uint32 traceComponent, |
|
const Uint32 level, |
|
const char* fmt, |
|
...) |
|
{ |
|
// empty function |
|
} |
|
|
|
inline void Tracer::traceString( |
|
const char* fileName, |
|
const Uint32 lineNum, |
|
const Uint32 traceComponent, |
|
const Uint32 level, |
|
const String& string) |
|
{ |
|
// empty function |
|
} |
|
|
|
inline void Tracer::traceCString( |
|
const char* fileName, |
|
const Uint32 lineNum, |
|
const Uint32 traceComponent, |
|
const Uint32 level, |
|
const char* cstring) |
|
{ |
|
// empty function |
|
} |
|
|
|
inline void Tracer::traceCIMException( |
|
const Uint32 traceComponent, |
|
const Uint32 level, |
|
const CIMException& cimException) |
|
{ |
|
// empty function |
|
} |
|
|
|
inline Uint32 Tracer::setTraceFile(const char* traceFile) |
|
{ |
|
// empty function |
|
return 0; |
|
} |
|
|
|
inline Uint32 Tracer::setTraceLevel(const Uint32 level) |
|
{ |
|
// empty function |
|
return 0; |
|
} |
|
|
|
inline void Tracer::setTraceComponents(const String& traceComponents) |
|
{ |
|
// empty function |
|
} |
|
|
|
#endif /* PEGASUS_REMOVE_TRACE */ |
|
|
|
//============================================================================== |
|
// |
|
// Tracing macros |
|
// |
|
//============================================================================== |
|
|
|
// Defines a variable that bypasses inclusion of line and filename in output. |
|
// #define PEGASUS_NO_FILE_LINE_TRACE=1 to exclude file names and line numbers |
|
#ifdef PEGASUS_NO_FILE_LINE_TRACE |
|
# define PEGASUS_COMMA_FILE_LINE /* empty */ |
|
# define PEGASUS_FILE_LINE_COMMA /* empty */ |
|
#else |
|
# define PEGASUS_COMMA_FILE_LINE ,__FILE__,__LINE__ |
|
# define PEGASUS_FILE_LINE_COMMA __FILE__,__LINE__, |
#endif | #endif |
| |
|
#ifdef PEGASUS_REMOVE_TRACE |
|
|
|
# define PEG_METHOD_ENTER(comp,meth) |
|
# define PEG_METHOD_EXIT() |
|
# define PEG_TRACE_STRING(comp,level,string) |
|
# define PEG_TRACE(VAR_ARGS) |
|
# define PEG_TRACE_CSTRING(comp,level,chars) |
|
|
|
#else /* PEGASUS_REMOVE_TRACE */ |
|
|
|
# define PEG_METHOD_ENTER(comp, meth) \ |
|
TracerToken __tracerToken; \ |
|
do \ |
|
{ \ |
|
if (Tracer::isTraceOn()) \ |
|
Tracer::traceEnter(__tracerToken PEGASUS_COMMA_FILE_LINE, comp, meth); \ |
|
} \ |
|
while (0) |
|
|
|
# define PEG_METHOD_EXIT() \ |
|
do \ |
|
{ \ |
|
if (Tracer::isTraceOn()) \ |
|
Tracer::traceExit(__tracerToken PEGASUS_COMMA_FILE_LINE); \ |
|
} \ |
|
while (0) |
|
|
|
// Macro for Trace String. the do construct allows this to appear |
|
// as a single statement. |
|
# define PEG_TRACE_STRING(comp, level, string) \ |
|
do \ |
|
{ \ |
|
if (Tracer::isTraceOn()) \ |
|
Tracer::traceString(PEGASUS_FILE_LINE_COMMA comp, level, string); \ |
|
} \ |
|
while (0) |
|
|
|
// Macro to trace character lists. the do construct allows this to appear |
|
// as a single statement. |
|
# define PEG_TRACE_CSTRING(comp, level, chars) \ |
|
do \ |
|
{ \ |
|
if (Tracer::isTraceOn()) \ |
|
Tracer::traceCString(PEGASUS_FILE_LINE_COMMA comp, level, chars); \ |
|
} \ |
|
while (0) |
|
|
|
// Macro for Trace variable number of arguments with format string. The trace |
|
// test is included becase of the possible cost of preparing the variable |
|
// number of arguments on each call. The d construct allows this to be |
|
// treated as a single statement. |
|
# define PEG_TRACE(VAR_ARGS) \ |
|
do \ |
|
{ \ |
|
if (Tracer::isTraceOn()) \ |
|
Tracer::trace VAR_ARGS; \ |
|
} \ |
|
while (0) |
|
|
|
#endif /* !PEGASUS_REMOVE_TRACE */ |
|
|
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |
|
|
#endif /* Pegasus_Tracer_h */ | #endif /* Pegasus_Tracer_h */ |