version 1.15, 2001/07/18 16:39:27
|
version 1.28.6.3, 2003/08/14 11:55:42
|
|
|
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001 The Open group, BMC Software, Tivoli Systems, IBM |
// Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM, |
|
// The Open Group, Tivoli Systems |
// | // |
// 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: Mike Brasher (mbrasher@bmc.com) | // Author: Mike Brasher (mbrasher@bmc.com) |
// | // |
// Modified By: |
// Modified By: Sushma Fernandes (Hewlett-Packard Company) |
|
// sushma_fernandes@hp.com |
|
// Modified By: Dave Rosckes (IBM) |
|
// rosckes@us.ibm.com |
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
#include <iostream> | #include <iostream> |
#include <fstream> | #include <fstream> |
#include "System.h" |
#include <cstring> |
#include "Logger.h" | #include "Logger.h" |
#include "System.h" | #include "System.h" |
|
#include "Destroyer.h" |
|
#include <Pegasus/Common/MessageLoader.h> //l10n |
| |
PEGASUS_USING_STD; | PEGASUS_USING_STD; |
| |
|
|
const Uint32 Logger::SEVERE = (1 << 3); | const Uint32 Logger::SEVERE = (1 << 3); |
const Uint32 Logger::FATAL = (1 << 4); | const Uint32 Logger::FATAL = (1 << 4); |
| |
|
static char const* LOGLEVEL_LIST[] = |
|
{ |
|
"TRACE", |
|
"INFORMATION", |
|
"WARNING", |
|
"SEVERE", |
|
"FATAL" |
|
}; |
|
|
|
|
LoggerRep* Logger::_rep = 0; | LoggerRep* Logger::_rep = 0; |
String Logger::_homeDirectory = "."; | String Logger::_homeDirectory = "."; |
Uint32 Logger::_severityMask = 0xFF; // Set all on by default |
|
|
const Uint32 Logger::_NUM_LOGLEVEL = 5; |
|
|
|
// Set separator |
|
const char Logger::_SEPARATOR = '@'; |
|
|
|
Uint32 Logger::_severityMask; |
|
|
Uint32 Logger::_writeControlMask = 0xF; // Set all on by default | Uint32 Logger::_writeControlMask = 0xF; // Set all on by default |
| |
|
// Set the return codes |
|
const Boolean Logger::_SUCCESS = 1; |
|
const Boolean Logger::_FAILURE = 0; |
|
|
/* _allocLogFileName. Allocates the name from a name set. | /* _allocLogFileName. Allocates the name from a name set. |
Today this is static. However, it should be completely | Today this is static. However, it should be completely |
configerable and driven from the config file so that | configerable and driven from the config file so that |
|
|
mask for level of severity are all driven from configuration | mask for level of severity are all driven from configuration |
input. | input. |
*/ | */ |
static char* _allocLogFileName( |
static CString _allocLogFileName( |
const String& homeDirectory, | const String& homeDirectory, |
Logger::LogFileType logFileType) | Logger::LogFileType logFileType) |
{ | { |
|
|
const char* logFileName = fileNames[index]; | const char* logFileName = fileNames[index]; |
| |
String result; | String result; |
result.reserve(homeDirectory.size() + 1 + strlen(logFileName)); |
result.reserveCapacity(homeDirectory.size() + 1 + strlen(logFileName)); |
result += homeDirectory; |
result.append(homeDirectory); |
result += '/'; |
result.append('/'); |
result += logFileName; |
result.append(logFileName); |
return result.allocateCString(); |
return result.getCString(); |
} | } |
| |
class LoggerRep | class LoggerRep |
|
|
| |
LoggerRep(const String& homeDirectory) | LoggerRep(const String& homeDirectory) |
{ | { |
|
#if !defined(PEGASUS_USE_SYSLOGS) |
// Add test for home directory set. | // Add test for home directory set. |
| |
// If home directory does not exist, create it. | // If home directory does not exist, create it. |
char* lgDir = homeDirectory.allocateCString(); |
CString lgDir = homeDirectory.getCString(); |
| |
if (!System::isDirectory(lgDir)) | if (!System::isDirectory(lgDir)) |
System::makeDirectory(lgDir); | System::makeDirectory(lgDir); |
| |
// KS: I put the second test in just in case some trys to create | // 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 | // a completly erronous directory. At least we will get a message |
if (!System::isDirectory(lgDir)) |
if (!System::isDirectory(lgDir)){ |
cout << "Logging Disabled"; |
//l10n |
delete [] lgDir; |
//cerr << "Logging Disabled"; |
|
MessageLoaderParms parms("Common.Logger.LOGGING_DISABLED", |
|
"Logging Disabled"); |
| |
|
cerr << MessageLoader::getMessage(parms); |
|
} |
| |
char* fileName = _allocLogFileName(homeDirectory, Logger::TRACE_LOG); |
CString fileName = _allocLogFileName(homeDirectory, Logger::TRACE_LOG); |
_logs[Logger::TRACE_LOG].open(fileName, ios::app); | _logs[Logger::TRACE_LOG].open(fileName, ios::app); |
delete [] fileName; |
|
| |
fileName = _allocLogFileName(homeDirectory, Logger::STANDARD_LOG); | fileName = _allocLogFileName(homeDirectory, Logger::STANDARD_LOG); |
_logs[Logger::STANDARD_LOG].open(fileName, ios::app); | _logs[Logger::STANDARD_LOG].open(fileName, ios::app); |
delete [] fileName; |
|
| |
fileName = _allocLogFileName(homeDirectory, Logger::ERROR_LOG); | fileName = _allocLogFileName(homeDirectory, Logger::ERROR_LOG); |
_logs[Logger::ERROR_LOG].open(fileName, ios::app); | _logs[Logger::ERROR_LOG].open(fileName, ios::app); |
delete [] fileName; |
|
| |
fileName = _allocLogFileName(homeDirectory, Logger::DEBUG_LOG); | fileName = _allocLogFileName(homeDirectory, Logger::DEBUG_LOG); |
_logs[Logger::DEBUG_LOG].open(fileName, ios::app); | _logs[Logger::DEBUG_LOG].open(fileName, ios::app); |
delete [] fileName; |
#endif |
| |
} | } |
| |
|
|
ofstream _logs[int(Logger::NUM_LOGS)]; | ofstream _logs[int(Logger::NUM_LOGS)]; |
}; | }; |
| |
void Logger::put( |
void Logger::_putInternal( |
LogFileType logFileType, | LogFileType logFileType, |
const String& systemId, | const String& systemId, |
Uint32 severity, |
const Uint32 logComponent, // TODO: Support logComponent mask in future release |
|
Uint32 logLevel, |
const String& formatString, | const String& formatString, |
|
const String& messageId, // l10n |
const Formatter::Arg& arg0, | const Formatter::Arg& arg0, |
const Formatter::Arg& arg1, | const Formatter::Arg& arg1, |
const Formatter::Arg& arg2, | const Formatter::Arg& arg2, |
|
|
const Formatter::Arg& arg8, | const Formatter::Arg& arg8, |
const Formatter::Arg& arg9) | const Formatter::Arg& arg9) |
{ | { |
// Test for severity against severity mask to determine |
// Test for logLevel against severity mask to determine |
// if we write this log. | // if we write this log. |
if ((_severityMask & severity) != 0) |
if ((_severityMask & logLevel) != 0) |
{ | { |
if (!_rep) | if (!_rep) |
_rep = new LoggerRep(_homeDirectory); | _rep = new LoggerRep(_homeDirectory); |
| |
// Get the Severity String |
// Get the logLevel String |
// This converts bitmap to string based on highest order | // This converts bitmap to string based on highest order |
// bit set | // bit set |
// ATTN: KS Fix this more efficiently. | // ATTN: KS Fix this more efficiently. |
|
|
// NUM_LEVELS = 5 | // NUM_LEVELS = 5 |
int sizeSvNames = sizeof(svNames) / sizeof(svNames[0]) - 1; | 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) |
|
|
|
// Open the syslog. |
|
// Ignore the systemId and open the log as cimserver |
|
System::openlog(systemId); |
|
|
|
// Log the message |
|
System::syslog(logLevel,(const char*)localizedMsg.getCStringUTF8()); |
|
|
|
// Close the syslog. |
|
System::closelog(); |
|
|
|
#else |
|
|
|
// Prepend the systemId to the incoming message |
|
String messageString(systemId); |
|
messageString.append(": "); |
|
messageString.append(localizedMsg); // l10n |
|
|
const char* tmp = ""; | const char* tmp = ""; |
if (severity & Logger::TRACE) tmp = "TRACE "; |
if (logLevel & Logger::TRACE) tmp = "TRACE "; |
if (severity & Logger::INFORMATION) tmp = "INFO "; |
if (logLevel & Logger::INFORMATION) tmp = "INFO "; |
if (severity & Logger::WARNING) tmp = "WARNING "; |
if (logLevel & Logger::WARNING) tmp = "WARNING "; |
if (severity & Logger::SEVERE) tmp = "SEVERE "; |
if (logLevel & Logger::SEVERE) tmp = "SEVERE "; |
if (severity & Logger::FATAL) tmp = "FATAL "; |
if (logLevel & Logger::FATAL) tmp = "FATAL "; |
|
_rep->logOf(logFileType) << System::getCurrentASCIITime() |
_rep->logOf(logFileType) << System::getCurrentASCIITime() << " " << tmp |
<< " " << tmp << messageString.getCStringUTF8() << endl; |
<< Formatter::format(formatString, |
|
arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) << endl; |
|
| |
|
#endif |
} | } |
} | } |
| |
void Logger::clean(const String& directory) |
void Logger::put( |
{ |
LogFileType logFileType, |
//String logFiles = logsDirectory; |
const String& systemId, |
//logFiles.append("/PegasusTrace.log"); |
Uint32 logLevel, |
//char* lgFiles = logFiles.allocateCString(); |
const String& formatString, |
//cout << "Delete logs in " << logFiles << endl; |
const Formatter::Arg& arg0, |
//System::removeFile(lgFiles); |
const Formatter::Arg& arg1, |
//delete [] lgFiles; |
const Formatter::Arg& arg2, |
//for (i = xx; i < yy; i++) |
const Formatter::Arg& arg3, |
//( |
const Formatter::Arg& arg4, |
//_allocateLogFileName(directory, i) |
const Formatter::Arg& arg5, |
//removeFile( |
const Formatter::Arg& arg6, |
//} |
const Formatter::Arg& arg7, |
|
const Formatter::Arg& arg8, |
|
const Formatter::Arg& arg9) |
|
{ |
|
Uint32 logComponent = 0; |
|
|
|
Logger::_putInternal( |
|
logFileType, |
|
systemId, |
|
logComponent, |
|
logLevel, |
|
formatString, |
|
//l10n |
|
String::EMPTY, |
|
arg0, |
|
arg1, |
|
arg2, |
|
arg3, |
|
arg4, |
|
arg5, |
|
arg6, |
|
arg7, |
|
arg8, |
|
arg9); |
|
} |
|
|
|
// l10n |
|
void Logger::put_l( |
|
LogFileType logFileType, |
|
const String& systemId, |
|
Uint32 logLevel, |
|
const String& messageId, // l10n |
|
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) |
|
{ |
|
Uint32 logComponent = 0; |
|
|
|
Logger::_putInternal( |
|
logFileType, |
|
systemId, |
|
logComponent, |
|
logLevel, |
|
formatString, |
|
messageId, |
|
arg0, |
|
arg1, |
|
arg2, |
|
arg3, |
|
arg4, |
|
arg5, |
|
arg6, |
|
arg7, |
|
arg8, |
|
arg9); |
|
} |
|
|
|
void Logger::trace( |
|
LogFileType logFileType, |
|
const String& systemId, |
|
const Uint32 logComponent, |
|
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) |
|
{ |
|
Uint32 logLevel = Logger::TRACE; |
|
|
|
Logger::_putInternal( |
|
logFileType, |
|
systemId, |
|
logComponent, |
|
logLevel, |
|
formatString, |
|
// l10n |
|
String::EMPTY, |
|
arg0, |
|
arg1, |
|
arg2, |
|
arg3, |
|
arg4, |
|
arg5, |
|
arg6, |
|
arg7, |
|
arg8, |
|
arg9); |
|
} |
|
|
|
// l10n |
|
void Logger::trace_l( |
|
LogFileType logFileType, |
|
const String& systemId, |
|
const Uint32 logComponent, |
|
const String& messageId, |
|
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) |
|
{ |
|
Uint32 logLevel = Logger::TRACE; |
|
|
|
Logger::_putInternal( |
|
logFileType, |
|
systemId, |
|
logComponent, |
|
logLevel, |
|
formatString, |
|
messageId, |
|
arg0, |
|
arg1, |
|
arg2, |
|
arg3, |
|
arg4, |
|
arg5, |
|
arg6, |
|
arg7, |
|
arg8, |
|
arg9); |
} | } |
| |
void Logger::setHomeDirectory(const String& homeDirectory) | void Logger::setHomeDirectory(const String& homeDirectory) |
|
|
_homeDirectory = homeDirectory; | _homeDirectory = homeDirectory; |
} | } |
| |
|
//////////////////////////////////////////////////////////////////////////////// |
|
// Set logLevel. |
|
//////////////////////////////////////////////////////////////////////////////// |
|
void Logger::setlogLevelMask( const String logLevelList ) |
|
{ |
|
Uint32 position = 0; |
|
Uint32 logLevelType; |
|
String logLevelName = logLevelList; |
|
|
|
// Check if logLevel has been specified |
|
if (logLevelName != String::EMPTY) |
|
{ |
|
// initialise _severityMask |
|
_severityMask = 0; |
|
|
|
// Set logLevelType to indicate the level of logging |
|
// required by the user. |
|
if (String::equalNoCase(logLevelName,"TRACE")) |
|
{ |
|
logLevelType = Logger::TRACE; |
|
} |
|
else if (String::equalNoCase(logLevelName,"INFORMATION")) |
|
{ |
|
logLevelType = Logger::INFORMATION; |
|
} |
|
else if (String::equalNoCase(logLevelName,"WARNING")) |
|
{ |
|
logLevelType = Logger::WARNING; |
|
} |
|
else if (String::equalNoCase(logLevelName,"SEVERE")) |
|
{ |
|
logLevelType = Logger::SEVERE; |
|
} |
|
else if (String::equalNoCase(logLevelName,"FATAL")) |
|
{ |
|
logLevelType = Logger::FATAL; |
|
} |
|
// Setting _severityMask. NOTE: When adding new logLevels |
|
// it is essential that they are adding in ascending order |
|
// based on priority. Once a case statement is true we will |
|
// continue to set all following log levels with a higher |
|
// priority. |
|
switch(logLevelType) |
|
{ |
|
case Logger::TRACE: |
|
_severityMask |= Logger::TRACE; |
|
case Logger::INFORMATION: |
|
_severityMask |= Logger::INFORMATION; |
|
case Logger::WARNING: |
|
_severityMask |= Logger::WARNING; |
|
case Logger::SEVERE: |
|
_severityMask |= Logger::SEVERE; |
|
case Logger::FATAL: |
|
_severityMask |= Logger::FATAL; |
|
} |
|
} |
|
else |
|
{ |
|
// Property logLevel not specified, set default value. |
|
_severityMask = ~Logger::TRACE; |
|
} |
|
return ; |
|
} |
|
|
|
Boolean Logger::isValidlogLevel( |
|
const String logLevel) |
|
{ |
|
// Validate the logLevel and modify the logLevel argument |
|
// to reflect the invalid logLevel |
|
|
|
Uint32 position=0; |
|
Uint32 index=0; |
|
String logLevelName = String::EMPTY; |
|
Boolean validlogLevel=false; |
|
Boolean retCode=true; |
|
|
|
logLevelName = logLevel; |
|
|
|
if (logLevelName != String::EMPTY) |
|
{ |
|
// Lookup the index for logLevel name in _logLevel_LIST |
|
index = 0; |
|
validlogLevel = false; |
|
|
|
while (index < _NUM_LOGLEVEL) |
|
{ |
|
if (String::equalNoCase(logLevelName, LOGLEVEL_LIST[index])) |
|
{ |
|
// Found logLevel, break from the loop |
|
validlogLevel = true; |
|
break; |
|
} |
|
else |
|
{ |
|
index++; |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
// logLevels is empty, it is a valid value so return true |
|
return _SUCCESS; |
|
} |
|
|
|
return validlogLevel; |
|
} |
|
|
|
|
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |