00001
00015 #pragma once
00016
00017 #include "LogLevel.h"
00018 #include "CompositeLoggable.h"
00019 #include "ChainLoggable.h"
00020 #include "FormattedChainLoggable.h"
00021 #include "Logger.h"
00022 #include "TStd.h"
00023
00027 #define DEFINE_LOGGER(name) \
00028 class _ScopeLoggerWrapper { \
00029 public: \
00030 static Nvidia::Logging::ScopeLogger& GetScopeLogger() \
00031 { \
00032 static Nvidia::Logging::ScopeLogger scopeLogger((name)); \
00033 return scopeLogger; \
00034 } \
00035 }
00036
00049 #define LOG(logLevel, message) \
00050 { \
00051 using namespace Nvidia::Logging; \
00052 if ( !_ScopeLoggerWrapper::GetScopeLogger().IsFiltered((LogLevel_ ## logLevel)) ) \
00053 { \
00054 _ScopeLoggerWrapper::GetScopeLogger().Log((LogLevel_ ## logLevel), \
00055 MakeChainLoggable(MakeEmptyChain() + message), \
00056 _T(__FUNCTION__), __LINE__, _T(__FILE__)); \
00057 } \
00058 }
00059
00075 #define LOGF(logLevel, format, message) \
00076 { \
00077 using namespace Nvidia::Logging; \
00078 if ( !_ScopeLoggerWrapper::GetScopeLogger().IsFiltered((LogLevel_ ## logLevel)) ) \
00079 { \
00080 _ScopeLoggerWrapper::GetScopeLogger().Log((LogLevel_ ## logLevel), \
00081 MakeFormattedChainLoggable(MakeEmptyChain() + message, format), \
00082 _T(__FUNCTION__), __LINE__, _T(__FILE__)); \
00083 } \
00084 }
00085
00086 namespace Nvidia {
00087 namespace Logging {
00088
00096 class ScopeLogger
00097 {
00098 private:
00100 std::tstring m_name;
00101
00107 LogLevel m_maximumLogLevel;
00108
00109 public:
00118 ScopeLogger(const std::tstring& name);
00119
00125 void Log(LogLevel logLevel, const CompositeLoggable& message, std::tstring functionName, int lineNumber, std::tstring fileName);
00126
00128 bool IsFiltered(LogLevel logLevel);
00129 };
00130
00131 inline ScopeLogger::ScopeLogger(const std::tstring& name) :
00132 m_name(name),
00133 m_maximumLogLevel(Logger::GetLogger().GetMaximumLogLevel(name)) {}
00134
00135 inline void ScopeLogger::Log(LogLevel logLevel, const CompositeLoggable& message, std::tstring functionName, int lineNumber, std::tstring fileName)
00136 {
00137 LogInfo logInfo(logLevel, m_name, functionName, fileName, lineNumber);
00138 Logger::GetLogger().Log(logInfo, message);
00139 }
00140
00141 inline bool ScopeLogger::IsFiltered(LogLevel logLevel)
00142 {
00143 return logLevel > m_maximumLogLevel;
00144 }
00145
00146 }
00147 }