📄 logger.cpp
字号:
//%2006//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development// 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// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions:// // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.////==============================================================================////%/////////////////////////////////////////////////////////////////////////////#include <iostream>#include <fstream>#include <cstring>#include "Logger.h"#include "System.h"#include <Pegasus/Common/MessageLoader.h>#if defined(PEGASUS_USE_SYSLOGS)# include <syslog.h>#endifPEGASUS_USING_STD;PEGASUS_NAMESPACE_BEGINconst Uint32 Logger::TRACE = (1 << 0);const Uint32 Logger::INFORMATION = (1 << 1);const Uint32 Logger::WARNING = (1 << 2);const Uint32 Logger::SEVERE = (1 << 3);const Uint32 Logger::FATAL = (1 << 4);static char const* LOGLEVEL_LIST[] ={ "TRACE", "INFORMATION", "WARNING", "SEVERE", "FATAL"};LoggerRep* Logger::_rep = 0;String Logger::_homeDirectory = ".";const Uint32 Logger::_NUM_LOGLEVEL = 5;// Set separatorconst char Logger::_SEPARATOR = '@';Uint32 Logger::_severityMask;Uint32 Logger::_writeControlMask = 0xF; // Set all on by default// Set the return codesconst Boolean Logger::_SUCCESS = 1;const Boolean Logger::_FAILURE = 0;/* _allocLogFileName. Allocates the name from a name set. Today this is static. However, it should be completely configerable and driven from the config file so that Log organization and names are open. ATTN: rewrite this so that names, choice to do logs and mask for level of severity are all driven from configuration input.*/static CString _allocLogFileName( const String& homeDirectory, Logger::LogFileType logFileType){ static const char* fileNames[] = { "PegasusTrace.log", "PegasusStandard.log", "PegasusAudit.log", "PegasusError.log", "PegasusDebug.log" }; int index = int(logFileType); if (index > Logger::NUM_LOGS) index = Logger::ERROR_LOG; const char* logFileName = fileNames[index]; String result; result.reserveCapacity(homeDirectory.size() + 1 + strlen(logFileName)); result.append(homeDirectory); result.append('/'); result.append(logFileName); return result.getCString();}class LoggerRep{public: LoggerRep(const String& homeDirectory) {#if !defined(PEGASUS_USE_SYSLOGS) // Add test for home directory set. // If home directory does not exist, create it. CString lgDir = homeDirectory.getCString(); if (!System::isDirectory(lgDir)) System::makeDirectory(lgDir); // KS: I put the second test in just in case some trys to create // a completly erronous directory. At least we will get a message if (!System::isDirectory(lgDir)) { MessageLoaderParms parms("Common.Logger.LOGGING_DISABLED", "Logging Disabled"); cerr << MessageLoader::getMessage(parms); } CString fileName = _allocLogFileName(homeDirectory, Logger::TRACE_LOG); _logs[Logger::TRACE_LOG].open(fileName, ios::app); fileName = _allocLogFileName(homeDirectory, Logger::STANDARD_LOG); _logs[Logger::STANDARD_LOG].open(fileName, ios::app);#ifndef PEGASUS_DISABLE_AUDIT_LOGGER fileName = _allocLogFileName(homeDirectory, Logger::AUDIT_LOG); _logs[Logger::AUDIT_LOG].open(fileName, ios::app);#endif fileName = _allocLogFileName(homeDirectory, Logger::ERROR_LOG); _logs[Logger::ERROR_LOG].open(fileName, ios::app); fileName = _allocLogFileName(homeDirectory, Logger::DEBUG_LOG); _logs[Logger::DEBUG_LOG].open(fileName, ios::app);#else#ifdef PEGASUS_OS_ZOS logIdentity = strdup(System::CIMSERVER.getCString()); // If System Log is used open it System::openlog(logIdentity, LOG_PID, LOG_DAEMON);#endif#endif } ~LoggerRep() {#if !defined(PEGASUS_USE_SYSLOGS) _logs[Logger::TRACE_LOG].close(); _logs[Logger::STANDARD_LOG].close();#ifndef PEGASUS_DISABLE_AUDIT_LOGGER _logs[Logger::AUDIT_LOG].close();#endif _logs[Logger::ERROR_LOG].close(); _logs[Logger::DEBUG_LOG].close();#else#ifdef PEGASUS_OS_ZOS System::closelog(); free(logIdentity);#endif#endif } ostream& logOf(Logger::LogFileType logFileType) { int index = int(logFileType); if (index > int(Logger::NUM_LOGS)) index = Logger::ERROR_LOG; return _logs[index]; }private:#ifdef PEGASUS_OS_ZOS char* logIdentity;#endif ofstream _logs[int(Logger::NUM_LOGS)];};void Logger::_putInternal( LogFileType logFileType, const String& systemId, const Uint32 logComponent, // FUTURE: Support logComponent mask Uint32 logLevel, const String& formatString, const String& messageId, const Formatter::Arg& arg0, const Formatter::Arg& arg1, const Formatter::Arg& arg2, const Formatter::Arg& arg3, const Formatter::Arg& arg4, const Formatter::Arg& arg5, const Formatter::Arg& arg6, const Formatter::Arg& arg7, const Formatter::Arg& arg8, const Formatter::Arg& arg9){ // Test for logLevel against severity mask to determine // if we write this log. if ((_severityMask & logLevel) != 0) { if (!_rep) _rep = new LoggerRep(_homeDirectory); // Get the logLevel String // This converts bitmap to string based on highest order // bit set // ATTN: KS Fix this more efficiently. static const char* svNames[] = { "TRACE ", "INFO ", "WARNING ", "SEVERE ", "FATAL " }; // NUM_LEVELS = 5 int sizeSvNames = sizeof(svNames) / sizeof(svNames[0]) - 1;// l10n start // The localized message to be sent to the system log. String localizedMsg; // If the caller specified a messageId, then load the localized // message in the locale of the server process. if (messageId != String::EMPTY) { // A message ID was specified. Use the MessageLoader. MessageLoaderParms msgParms(messageId, formatString); msgParms.useProcessLocale = true; msgParms.arg0 = arg0; msgParms.arg1 = arg1; msgParms.arg2 = arg2; msgParms.arg3 = arg3; msgParms.arg4 = arg4; msgParms.arg5 = arg5; msgParms.arg6 = arg6; msgParms.arg7 = arg7; msgParms.arg8 = arg8; msgParms.arg9 = arg9; localizedMsg = MessageLoader::getMessage(msgParms); } else { // No message ID. Use the Pegasus formatter localizedMsg = Formatter::format(formatString, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); }// l10n end#if defined(PEGASUS_USE_SYSLOGS) // Log the message System::syslog(systemId, logLevel, localizedMsg.getCString());#else // Prepend the systemId to the incoming message String messageString(systemId); messageString.append(": "); messageString.append(localizedMsg); // l10n const char* tmp = ""; if (logLevel & Logger::TRACE) tmp = "TRACE "; if (logLevel & Logger::INFORMATION) tmp = "INFO "; if (logLevel & Logger::WARNING) tmp = "WARNING "; if (logLevel & Logger::SEVERE) tmp = "SEVERE "; if (logLevel & Logger::FATAL) tmp = "FATAL "; _rep->logOf(logFileType) << System::getCurrentASCIITime() << " " << tmp << (const char *)messageString.getCString() << endl;#endif }}//////////////////////////////////////////////////////////////////////////////////// Public methods start here://////////////////////////////////////////////////////////////////////////////////void Logger::put( LogFileType logFileType, const String& systemId, Uint32 logLevel, const String& formatString, const Formatter::Arg& arg0, const Formatter::Arg& arg1, const Formatter::Arg& arg2, const Formatter::Arg& arg3, const Formatter::Arg& arg4, const Formatter::Arg& arg5, const Formatter::Arg& arg6, const Formatter::Arg& arg7, const Formatter::Arg& arg8, const Formatter::Arg& arg9){ if (wouldLog(logLevel)) { Logger::_putInternal(logFileType, systemId, 0, logLevel, formatString, String::EMPTY, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); }}void Logger::put( LogFileType logFileType, const String& systemId, Uint32 logLevel, const String& formatString){ if (wouldLog(logLevel)) { Logger::_putInternal(logFileType, systemId, 0, logLevel, formatString, String::EMPTY); }}void Logger::put( LogFileType logFileType, const String& systemId, Uint32 logLevel, const String& formatString, const Formatter::Arg& arg0){ if (wouldLog(logLevel)) { Logger::_putInternal(logFileType, systemId, 0, logLevel, formatString, String::EMPTY, arg0); }}void Logger::put( LogFileType logFileType, const String& systemId, Uint32 logLevel, const String& formatString, const Formatter::Arg& arg0, const Formatter::Arg& arg1){ if (wouldLog(logLevel)) { Logger::_putInternal(logFileType, systemId, 0, logLevel, formatString, String::EMPTY, arg0, arg1); }}void Logger::put( LogFileType logFileType,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -