00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00035 #include "OW_config.h"
00036 #include "OW_Logger.hpp"
00037 #include "OW_ExceptionIds.hpp"
00038 #include "OW_LogMessage.hpp"
00039 #include "OW_Assertion.hpp"
00040 #include "OW_Array.hpp"
00041 #include "OW_ConfigFile.hpp"
00042 #include "OW_LogMessagePatternFormatter.hpp"
00043 #include "OW_AppenderLogger.hpp"
00044 #include "OW_LogAppender.hpp"
00045 #include "OW_ConfigOpts.hpp"
00046 #include "OW_Format.hpp"
00047 #include "OW_Mutex.hpp"
00048 #include "OW_MutexLock.hpp"
00049 #include "OW_ThreadOnce.hpp"
00050 #include "OW_NullLogger.hpp"
00051
00052 namespace OW_NAMESPACE
00053 {
00054
00055 OW_DEFINE_EXCEPTION_WITH_ID(Logger);
00056
00057 const String Logger::STR_NONE_CATEGORY("NONE");
00058 const String Logger::STR_FATAL_CATEGORY("FATAL");
00059 const String Logger::STR_ERROR_CATEGORY("ERROR");
00060 const String Logger::STR_INFO_CATEGORY("INFO");
00061 const String Logger::STR_DEBUG_CATEGORY("DEBUG");
00062 const String Logger::STR_ALL_CATEGORY("ALL");
00063 const String Logger::STR_DEFAULT_COMPONENT("none");
00064
00066 Logger::~Logger()
00067 {
00068 }
00069
00071 Logger::Logger()
00072 : m_logLevel(E_ERROR_LEVEL)
00073 , m_defaultComponent(STR_DEFAULT_COMPONENT)
00074 {
00075 }
00076
00078 Logger::Logger(const ELogLevel l)
00079 : m_logLevel(l)
00080 , m_defaultComponent(STR_DEFAULT_COMPONENT)
00081 {
00082 }
00083
00085 Logger::Logger(const String& defaultComponent, const ELogLevel l)
00086 : m_logLevel(l)
00087 , m_defaultComponent(defaultComponent)
00088 {
00089 OW_ASSERT(m_defaultComponent != "");
00090 }
00091
00093 void
00094 Logger::processLogMessage(const LogMessage& message) const
00095 {
00096 OW_ASSERT(!message.component.empty());
00097 OW_ASSERT(!message.category.empty());
00098 OW_ASSERT(!message.message.empty());
00099
00100 doProcessLogMessage(message);
00101 }
00102
00104 void
00105 Logger::setLogLevel(const String& l)
00106 {
00107 if (l.equalsIgnoreCase(STR_INFO_CATEGORY))
00108 {
00109 setLogLevel(E_INFO_LEVEL);
00110 }
00111 else if (l.equalsIgnoreCase(STR_DEBUG_CATEGORY))
00112 {
00113 setLogLevel(E_DEBUG_LEVEL);
00114 }
00115 else if (l.equalsIgnoreCase(STR_ERROR_CATEGORY))
00116 {
00117 setLogLevel(E_ERROR_LEVEL);
00118 }
00119 else if (l.equalsIgnoreCase(STR_ALL_CATEGORY))
00120 {
00121 setLogLevel(E_ALL_LEVEL);
00122 }
00123 else if (l.equalsIgnoreCase(STR_NONE_CATEGORY))
00124 {
00125 setLogLevel(E_NONE_LEVEL);
00126 }
00127 else
00128 {
00129 setLogLevel(E_FATAL_ERROR_LEVEL);
00130 }
00131 }
00132
00134 void
00135 Logger::logFatalError(const String& message, const char* filename, int fileline, const char* methodname) const
00136 {
00137 if (m_logLevel >= E_FATAL_ERROR_LEVEL)
00138 {
00139 processLogMessage( LogMessage(m_defaultComponent, STR_FATAL_CATEGORY, message, filename, fileline, methodname) );
00140 }
00141 }
00142
00144 void
00145 Logger::logError(const String& message, const char* filename, int fileline, const char* methodname) const
00146 {
00147 if (m_logLevel >= E_ERROR_LEVEL)
00148 {
00149 processLogMessage( LogMessage(m_defaultComponent, STR_ERROR_CATEGORY, message, filename, fileline, methodname) );
00150 }
00151 }
00152
00154 void
00155 Logger::logInfo(const String& message, const char* filename, int fileline, const char* methodname) const
00156 {
00157 if (m_logLevel >= E_INFO_LEVEL)
00158 {
00159 processLogMessage( LogMessage(m_defaultComponent, STR_INFO_CATEGORY, message, filename, fileline, methodname) );
00160 }
00161 }
00162
00164 void
00165 Logger::logDebug(const String& message, const char* filename, int fileline, const char* methodname) const
00166 {
00167 if (m_logLevel >= E_DEBUG_LEVEL)
00168 {
00169 processLogMessage( LogMessage(m_defaultComponent, STR_DEBUG_CATEGORY, message, filename, fileline, methodname) );
00170 }
00171 }
00172
00174 void
00175 Logger::logMessage(const String& component, const String& category, const String& message) const
00176 {
00177 processLogMessage(LogMessage(component, category, message, 0, -1, 0));
00178 }
00179
00181 void
00182 Logger::logMessage(const String& component, const String& category, const String& message, const char* filename, int fileline, const char* methodname) const
00183 {
00184 processLogMessage(LogMessage(component, category, message, filename, fileline, methodname));
00185 }
00186
00188 void
00189 Logger::logMessage(const String& category, const String& message) const
00190 {
00191 processLogMessage(LogMessage(m_defaultComponent, category, message, 0, -1, 0));
00192 }
00193
00195 void
00196 Logger::logMessage(const String& category, const String& message, const char* filename, int fileline, const char* methodname) const
00197 {
00198 processLogMessage(LogMessage(m_defaultComponent, category, message, filename, fileline, methodname));
00199 }
00200
00202 void
00203 Logger::logMessage(const LogMessage& message) const
00204 {
00205 processLogMessage(message);
00206 }
00207
00209 bool
00210 Logger::categoryIsEnabled(const String& category) const
00211 {
00212 return doCategoryIsEnabled(category);
00213 }
00214
00216 bool
00217 Logger::componentAndCategoryAreEnabled(const String& component, const String& category) const
00218 {
00219 return doComponentAndCategoryAreEnabled(component, category);
00220 }
00221
00223 bool
00224 Logger::doComponentAndCategoryAreEnabled(const String& component, const String& category) const
00225 {
00226 return true;
00227 }
00228
00230 bool
00231 Logger::doCategoryIsEnabled(const String& category) const
00232 {
00233 return true;
00234 }
00235
00237 void
00238 Logger::setDefaultComponent(const String& component)
00239 {
00240 OW_ASSERT(component != "");
00241 m_defaultComponent = component;
00242 }
00243
00245 String
00246 Logger::getDefaultComponent() const
00247 {
00248 return m_defaultComponent;
00249 }
00250
00252 void
00253 Logger::setLogLevel(ELogLevel logLevel)
00254 {
00255 m_logLevel = logLevel;
00256 }
00257
00259 LoggerRef
00260 Logger::createLogger( const String& type, bool debug )
00261 {
00262 LogAppender::ConfigMap configItems;
00263
00264 Array<LogAppenderRef> appenders;
00265 String name("");
00266 if (type == LogAppender::TYPE_SYSLOG || type == LogAppender::TYPE_STDERR || type == LogAppender::TYPE_NULL)
00267 {
00268 appenders.push_back(LogAppender::createLogAppender(name, LogAppender::ALL_COMPONENTS, LogAppender::ALL_CATEGORIES,
00269 LogMessagePatternFormatter::STR_DEFAULT_MESSAGE_PATTERN, type, configItems));
00270 }
00271 else
00272 {
00273
00274 String configItem = Format(ConfigOpts::LOG_1_LOCATION_opt, name);
00275 String filename = type;
00276 configItems[configItem] = filename;
00277 appenders.push_back(LogAppender::createLogAppender(name, LogAppender::ALL_COMPONENTS, LogAppender::ALL_CATEGORIES,
00278 LogMessagePatternFormatter::STR_DEFAULT_MESSAGE_PATTERN, LogAppender::TYPE_FILE, configItems));
00279 }
00280
00281 if ( debug )
00282 {
00283 appenders.push_back(LogAppender::createLogAppender(name, LogAppender::ALL_COMPONENTS, LogAppender::ALL_CATEGORIES,
00284 LogMessagePatternFormatter::STR_DEFAULT_MESSAGE_PATTERN, LogAppender::TYPE_STDERR, configItems));
00285
00286 }
00287
00288 return LoggerRef(new AppenderLogger(STR_DEFAULT_COMPONENT, appenders));
00289
00290 }
00291
00293 LoggerRef
00294 Logger::clone() const
00295 {
00296 return doClone();
00297 }
00298
00300 Logger::Logger(const Logger& x)
00301 : IntrusiveCountableBase(x)
00302 , m_logLevel(x.m_logLevel)
00303 , m_defaultComponent(x.m_defaultComponent)
00304
00305 {
00306 }
00307
00309 Logger&
00310 Logger::operator=(const Logger& x)
00311 {
00312 m_logLevel = x.m_logLevel;
00313 m_defaultComponent = x.m_defaultComponent;
00314 return *this;
00315 }
00316
00318 void
00319 Logger::swap(Logger& x)
00320 {
00321 std::swap(m_logLevel, x.m_logLevel);
00322 m_defaultComponent.swap(x.m_defaultComponent);
00323 }
00324
00326
00327 extern "C"
00328 {
00329 static void freeThreadLogger(void *ptr)
00330 {
00331 delete static_cast<LoggerRef *>(ptr);
00332 }
00333 }
00334
00336 namespace
00337 {
00338
00339 OnceFlag g_onceGuard = OW_ONCE_INIT;
00340 Mutex *g_mutexGuard = NULL;
00341 pthread_key_t g_loggerKey;
00342 LoggerRef g_defaultLogger;
00343
00344
00346 void initGuardAndKey()
00347 {
00348 g_mutexGuard = new Mutex();
00349 int ret = pthread_key_create(&g_loggerKey, freeThreadLogger);
00350 OW_ASSERTMSG(ret == 0, "failed create a thread specific key");
00351 }
00352
00353
00354 }
00355
00357
00358 bool
00359 Logger::setDefaultLogger(const LoggerRef &ref)
00360 {
00361 if (ref)
00362 {
00363 callOnce(g_onceGuard, initGuardAndKey);
00364 MutexLock lock(*g_mutexGuard);
00365
00366 g_defaultLogger = ref;
00367 return true;
00368 }
00369 return false;
00370 }
00371
00372
00374
00375 bool
00376 Logger::setThreadLogger(const LoggerRef &ref)
00377 {
00378
00379 if (ref)
00380 {
00381 callOnce(g_onceGuard, initGuardAndKey);
00382 LoggerRef *ptr = new LoggerRef(ref);
00383
00384 freeThreadLogger(pthread_getspecific(g_loggerKey));
00385
00386 int ret = pthread_setspecific(g_loggerKey, ptr);
00387 if (ret)
00388 {
00389 delete ptr;
00390 }
00391 OW_ASSERTMSG(ret == 0, "failed to set a thread specific logger");
00392 return true;
00393 }
00394 return false;
00395 }
00396
00397
00399
00400 LoggerRef
00401 Logger::getDefaultLogger()
00402 {
00403 callOnce(g_onceGuard, initGuardAndKey);
00404 MutexLock lock(*g_mutexGuard);
00405 if (!g_defaultLogger)
00406 {
00407 g_defaultLogger = LoggerRef(new NullLogger());
00408 }
00409 return g_defaultLogger;
00410 }
00411
00412
00414
00415 LoggerRef
00416 Logger::getCurrentLogger()
00417 {
00418 callOnce(g_onceGuard, initGuardAndKey);
00419 LoggerRef *ptr = static_cast<LoggerRef *>(pthread_getspecific(g_loggerKey));
00420 if(ptr)
00421 {
00422 return *ptr;
00423 }
00424 else
00425 {
00426 return getDefaultLogger();
00427 }
00428 }
00429
00431 bool
00432 Logger::levelIsEnabled(const ELogLevel level)
00433 {
00434 return (getLogLevel() >= level);
00435 }
00436
00437 }
00438