windows-nt/Source/XPSP1/NT/admin/services/sched/test/jt/log.hxx
2020-09-26 16:20:57 +08:00

289 lines
8 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: log.hxx
//
// Contents: Simple thread safe logging routine.
//
// Classes: CLog
//
// History: 02-10-94 DavidMun Created
//
//----------------------------------------------------------------------------
#ifndef _LOG_HXX
#define _LOG_HXX
//
// Handy array size utility macro
//
#define NUM_ELEMS(x) (sizeof(x) / sizeof((x)[0]))
//
// Misc constants
//
// BANNER_WIDTH - the width of the lines written to the log. Except for
// LOG_TEXT lines, all lines are wrapped at this column
//
// CCH_MAX_LOG_STRING - max size of logged string
//
// BANNER_WIDTH_EQUALS - BANNER_WIDTH '=' characters
//
// BANNER_WIDTH_DASH - BANNER_WIDTH '-' characters
//
// DEFAULT_LOGFILE - default value for ctor log filename
//
const ULONG BANNER_WIDTH = 79;
const ULONG CCH_MAX_LOG_STRING = 1024;
const CHAR BANNER_WIDTH_EQUALS[] = "===============================================================================";
const CHAR BANNER_WIDTH_DASH[] = "-------------------------------------------------------------------------------";
const CHAR DEFAULT_LOGFILE[] = "default.log";
//
// Logging destination bits used with Write() and SetDefaultDestinations()
//
// LOG_TOCONSOLE - log to the console (i.e., use printf()).
//
// LOG_TOFILE - log to a file
//
// LOG_TODEBUG - log to debugger
//
const ULONG LOG_TOCONSOLE = 0x10000000;
const ULONG LOG_TOFILE = 0x20000000;
const ULONG LOG_TODEBUG = 0x40000000;
const ULONG LOG_DESTINATIONBITS = 0xF0000000;
//
// Logging info levels. If the bitwise and of the log infolevel and the
// infolevel passed to Write is nonzero, the string passed to Write is
// logged, otherwise it goes to the bit bucket.
//
// No more than one of these infolevel bits should be on.
//
//
const ULONG LOG_PASS = 0x00000001;
const ULONG LOG_FAIL = 0x00000002;
const ULONG LOG_WARN = 0x00000004;
const ULONG LOG_START = 0x00000008;
const ULONG LOG_INFO = 0x00000010;
const ULONG LOG_TEXT = 0x00000020;
const ULONG LOG_END = 0x00000040;
const ULONG LOG_SKIP = 0x00000080;
const ULONG LOG_ABORT = 0x00000100;
const ULONG LOG_ERROR = 0x00000200;
const ULONG LOG_TRACE = 0x00000400;
const ULONG LOG_PERF = 0x00000800;
const ULONG LOG_DEBUG = 0x00001000;
const ULONG LOG_RESERVEDBITS = 0xF0001FFF;
const CHAR START_PREFIX[] = "[START %s]";
const CHAR END_PREFIX[] = "[END %s]";
const CHAR PASS_PREFIX[] = "[PASS ] ";
const CHAR FAIL_PREFIX[] = "[FAIL ] ";
const CHAR WARN_PREFIX[] = "[WARN ] ";
const CHAR INFO_PREFIX[] = "[INFO ] ";
const CHAR SKIP_PREFIX[] = "[SKIP ] ";
const CHAR ABORT_PREFIX[] = "[ABORT] ";
const CHAR ERROR_PREFIX[] = "[ERROR] ";
const CHAR TRACE_PREFIX[] = "[TRACE] ";
const CHAR PERF_PREFIX[] = "[PERF ] ";
const CHAR DEBUG_PREFIX[] = "[DEBUG] ";
const ULONG CCH_MAX_START_MESSAGE = BANNER_WIDTH - NUM_ELEMS(START_PREFIX);
//+---------------------------------------------------------------------------
//
// Class: CLog
//
// Purpose: Provide simple thread safe logging support.
//
// Interface: CLog - ctor
// ~CLog - dtor
// SetDefaultDestinations - set default output locations
// GetDefaultDestinations - get default output locations
// SetFile - set log file name
// SetInfoLevel - set infolevel mask bits
// GetInfoLevel - get infolevel mask bits
// Write - write a line in the log file
//
// History: 02-10-94 DavidMun Created
//
//----------------------------------------------------------------------------
class CLog
{
public:
CLog(
const CHAR *szTestTitle,
const CHAR *szLogFile = DEFAULT_LOGFILE,
ULONG flDefaultDestinations = LOG_TOCONSOLE,
ULONG flLogInfoLevel = (LOG_RESERVEDBITS & ~LOG_DESTINATIONBITS));
~CLog();
inline ULONG SetDefaultDestinations(ULONG flDestinations);
inline ULONG GetDefaultDestinations() const;
VOID SetFile(const CHAR *szNewFilename);
VOID SetFile(const WCHAR *wszNewFilename);
inline const CHAR *GetFile() const;
ULONG SetInfoLevel(ULONG flNewInfoLevel);
inline ULONG GetInfoLevel() const;
VOID Write(ULONG flLevelAndDest, const CHAR *pszFmt, ...);
inline VOID SuppressHeaderFooter(BOOL fSuppress);
private:
VOID _LogPrefix(
ULONG flLevel,
const CHAR *szLastStart,
CHAR *pszPrefix);
VOID _LogHeader();
VOID _LogFooter();
CRITICAL_SECTION _critsec;
BOOL _fLoggedHeader;
BOOL _fSuppress;
ULONG _cLogPass;
ULONG _cLogFail;
ULONG _cLogWarn;
ULONG _cLogStart;
ULONG _cLogInfo;
ULONG _cLogSkip;
ULONG _cLogAbort;
ULONG _cLogError;
ULONG _cLogOther;
ULONG _flDefaultDestinations;
ULONG _flInfoLevel;
CHAR _szLogFile[MAX_PATH];
CHAR _szTestTitle[BANNER_WIDTH / 2]; // enforce short test titles
};
//+---------------------------------------------------------------------------
//
// Member: CLog::GetFile
//
// Synopsis: Return name of log file.
//
// History: 04-01-95 DavidMun Created
//
//----------------------------------------------------------------------------
inline const CHAR *CLog::GetFile() const
{
return _szLogFile;
}
//+---------------------------------------------------------------------------
//
// Member: CLog::SuppressHeaderFooter
//
// Synopsis: Call this with TRUE before logging anything to prevent
// the header/footer from being logged.
//
// Arguments: [fSuppress] - if TRUE, no header or footer will be logged.
//
// History: 04-01-95 DavidMun Created
//
//----------------------------------------------------------------------------
inline VOID CLog::SuppressHeaderFooter(BOOL fSuppress)
{
_fSuppress = fSuppress;
}
//+---------------------------------------------------------------------------
//
// Member: CLog::SetDefaultDestinations
//
// Synopsis: Set the default destinations for logging
//
// Arguments: [flDestinations] - LOG_TO* bits
//
// Returns: Previous default destination bits
//
// History: 02-11-94 DavidMun Created
//
//----------------------------------------------------------------------------
inline ULONG CLog::SetDefaultDestinations(ULONG flDestinations)
{
ULONG flOldDefault = _flDefaultDestinations;
_flDefaultDestinations = flDestinations & LOG_DESTINATIONBITS;
return flOldDefault;
}
//+---------------------------------------------------------------------------
//
// Member: CLog::GetDefaultDestinations
//
// Synopsis: Return default destination bits
//
// History: 02-11-94 DavidMun Created
//
//----------------------------------------------------------------------------
inline ULONG CLog::GetDefaultDestinations() const
{
return _flDefaultDestinations;
}
//+---------------------------------------------------------------------------
//
// Member: CLog::GetInfoLevel
//
// Synopsis: Return infolevel mask
//
// History: 02-11-94 DavidMun Created
//
//----------------------------------------------------------------------------
inline ULONG CLog::GetInfoLevel() const
{
return _flInfoLevel;
}
//
// Consts and declaration for LogIt() helper func
//
const ULONG MAX_LOGIT_MSG = 1024UL;
const HRESULT EXPECT_SUCCEEDED = (HRESULT) -1;
VOID LogIt(HRESULT hrFound, HRESULT hrExpected, CHAR *szFormat, ...);
#endif