You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-user@logging.apache.org by John Reynolds <Jo...@flightman.com> on 2006/02/22 11:16:57 UTC
Abstraction and static
Hi all,
As a newbie to log4cxx please forgive me if I am talking out of my arse
and I am having difficulty in formulating my thoughts this morning (need
more caffine).
For most of my code I like to abstract third party libraries (by
wrapping such library functionality) from my code so I can switch such
libraries with ease. With log4cxx it seems I can not do this due to the
logger name being tied to my source code class by
class Bar
{
static log4cxx::LoggerPtr logger;
}
which is static as getLogger requires a static.
Is there a way of creating an instance of my abstraction logger class
(an instance for each class) and pass in the name and call getLogger
with that name.
I hope that this is clear enough to understand.
Many Thanks
John
Re: Abstraction and static
Posted by Josh Clark <id...@gmail.com>.
I did the same thing. Here is the interface I made we use. I'll leave the
implementation as an exercise for the reader :)
----------------------------------------------------------------------------------
#pragma once
//
// Logging Framework
//
// --------------------------
//
// Logging - The simple way:
//
// SVLOG_SIMPLE_INFO("My Log Statement");
//
//
// Logging - The slightly more complicated way:
//
// ILogger* pLogger = GetLogger("My.Logger.Name");
// SVLOG_DEBUG( pLogger, "A debug log statement" );
//
//
// Application setup:
//
// You need to call LoggingInitialize() at startup and
// LoggingDeInitialize() at shutdown. LoggingDeInitialize() needs to
// be called before globals are destructed - otherwise you'll blow up.
//
//
// Thread setup:
//
// At the start of each thread, before any logging is done, you need to
set
// the user id and site id. This information is thread specific so
you'll need
// to set this for both the main thread and any threads you create. If
you forget,
// your logging statements will assert in debug mode. The value of these
does not
// matter. They just need to be set.
//
#ifdef SVLOG_EXPORTS
#define SVLOG_API __declspec(dllexport)
#else
#define SVLOG_API __declspec(dllimport)
#pragma comment(lib, "svlog.lib")
#endif
#include <string>
struct LogLocationInfo
{
LogLocationInfo( const char* szFile, const char* szFunc, int nLine )
: lineNumber(nLine), fileName(szFile), methodName(szFunc) {}
int lineNumber;
const char * fileName;
const char * methodName;
};
struct ILogger
{
virtual bool isDebugEnabled() = 0;
virtual bool isInfoEnabled() = 0;
virtual bool isWarnEnabled() = 0;
virtual bool isErrorEnabled() = 0;
virtual bool isFatalEnabled() = 0;
// Single int parameter version
virtual void LogMessageDebug(const std::string& message, int nParam,
const LogLocationInfo& location) = 0;
virtual void LogMessageInfo(const std::string& message, int nParam,
const LogLocationInfo& location) = 0;
virtual void LogMessageWarn(const std::string& message, int nParam,
const LogLocationInfo& location) = 0;
virtual void LogMessageError(const std::string& message, int nParam,
const LogLocationInfo& location) = 0;
virtual void LogMessageFatal(const std::string& message, int nParam,
const LogLocationInfo& location) = 0;
// Single string parameter version
virtual void LogMessageDebug(const std::string& message, const char*
szParam, const LogLocationInfo& location) = 0;
virtual void LogMessageInfo(const std::string& message, const char*
szParam, const LogLocationInfo& location) = 0;
virtual void LogMessageWarn(const std::string& message, const char*
szParam, const LogLocationInfo& location) = 0;
virtual void LogMessageError(const std::string& message, const char*
szParam, const LogLocationInfo& location) = 0;
virtual void LogMessageFatal(const std::string& message, const char*
szParamm, const LogLocationInfo& location) = 0;
// Single double parameter version
virtual void LogMessageDebug(const std::string& message, double dParam,
const LogLocationInfo& location) = 0;
virtual void LogMessageInfo(const std::string& message, double dParam,
const LogLocationInfo& location) = 0;
virtual void LogMessageWarn(const std::string& message, double dParam,
const LogLocationInfo& location) = 0;
virtual void LogMessageError(const std::string& message, double dParam,
const LogLocationInfo& location) = 0;
virtual void LogMessageFatal(const std::string& message, double dParam,
const LogLocationInfo& location) = 0;
};
//
// The exported functions.
//
SVLOG_API void LoggingInitialize(const char* szLoggingConfigFile);
SVLOG_API void LoggingDeInitialize();
SVLOG_API void LoggingThreadInitialize();
SVLOG_API void LoggingThreadDeInitialize();
SVLOG_API ILogger* GetLogger(const char* szLoggerName);
SVLOG_API void LoggingSetContext(const char* szContext, const char*
szValue);
SVLOG_API void LoggingSetUser(const char* szUserName);
SVLOG_API void LoggingSetSiteId(long nSiteId);
//
// Helper class to handle thread initialization and deinitialization
//
class CLoggingThreadInitializer
{
public:
CLoggingThreadInitializer() { LoggingThreadInitialize(); }
~CLoggingThreadInitializer() { LoggingThreadDeInitialize(); }
CLoggingThreadInitializer(const char* szUserName, long nSiteId)
{
LoggingThreadInitialize();
LoggingSetUser(szUserName);
LoggingSetSiteId(nSiteId);
}
};
//
// Logging Macros. Only use the message parameter if that logging level is
active.
//
#define SVLOG_LOCATION LogLocationInfo(__FILE__, __FUNCSIG__, __LINE__)
#define SVLOG_DEBUG(logger, message) { if (logger->isDebugEnabled()) {
logger->LogMessageDebug(message, "", SVLOG_LOCATION); }}
#define SVLOG_INFO(logger, message) { if (logger->isInfoEnabled()) {
logger->LogMessageInfo(message, "", SVLOG_LOCATION); }}
#define SVLOG_WARN(logger, message) { if (logger->isWarnEnabled()) {
logger->LogMessageWarn(message, "", SVLOG_LOCATION); }}
#define SVLOG_ERROR(logger, message) { if (logger->isErrorEnabled()) {
logger->LogMessageError(message, "", SVLOG_LOCATION); }}
#define SVLOG_FATAL(logger, message) { if (logger->isFatalEnabled()) {
logger->LogMessageFatal(message, "", SVLOG_LOCATION); }}
#define SVLOG_DEBUG1(logger, message, p1) { if (logger->isDebugEnabled()) {
logger->LogMessageDebug(message, p1, SVLOG_LOCATION); }}
#define SVLOG_INFO1(logger, message, p1) { if (logger->isInfoEnabled()) {
logger->LogMessageInfo(message, p1, SVLOG_LOCATION); }}
#define SVLOG_WARN1(logger, message, p1) { if (logger->isWarnEnabled()) {
logger->LogMessageWarn(message, p1, SVLOG_LOCATION); }}
#define SVLOG_ERROR1(logger, message, p1) { if (logger->isErrorEnabled()) {
logger->LogMessageError(message, p1, SVLOG_LOCATION); }}
#define SVLOG_FATAL1(logger, message, p1) { if (logger->isFatalEnabled()) {
logger->LogMessageFatal(message, p1, SVLOG_LOCATION); }}
//
// Simple version. Assumes SVLOG_DEFAULT_LOGGER is defined.
//
#define SVLOG_SIMPLE_DEBUG(message) SVLOG_DEBUG(
GetLogger(SVLOG_DEFAULT_LOGGER), message )
#define SVLOG_SIMPLE_INFO(message) SVLOG_INFO(
GetLogger(SVLOG_DEFAULT_LOGGER), message )
#define SVLOG_SIMPLE_WARN(message) SVLOG_WARN(
GetLogger(SVLOG_DEFAULT_LOGGER), message )
#define SVLOG_SIMPLE_ERROR(message) SVLOG_ERROR(
GetLogger(SVLOG_DEFAULT_LOGGER), message )
#define SVLOG_SIMPLE_FATAL(message) SVLOG_FATAL(
GetLogger(SVLOG_DEFAULT_LOGGER), message )
#define SVLOG_SIMPLE_DEBUG1(message, p1) SVLOG_DEBUG1(
GetLogger(SVLOG_DEFAULT_LOGGER), message, p1 )
#define SVLOG_SIMPLE_INFO1(message, p1) SVLOG_INFO1(
GetLogger(SVLOG_DEFAULT_LOGGER), message, p1 )
#define SVLOG_SIMPLE_WARN1(message, p1) SVLOG_WARN1(
GetLogger(SVLOG_DEFAULT_LOGGER), message, p1 )
#define SVLOG_SIMPLE_ERROR1(message, p1) SVLOG_ERROR1(
GetLogger(SVLOG_DEFAULT_LOGGER), message, p1 )
#define SVLOG_SIMPLE_FATAL1(message, p1) SVLOG_FATAL1(
GetLogger(SVLOG_DEFAULT_LOGGER), message, p1 )