如何在自定义单例中使用 log4cplus class
How to use log4cplus in a custom singleton class
我在自定义classLogCp的构造函数中配置了这个log4cplus的静态对象,在这个构造函数中我写了一些测试代码,它可以正确地将信息导出到指定的文件,但是当我调用GetInstance 函数,它将 return 唯一的对象,它无法写入日志,错误消息是找不到 filelogger.It 的附加程序让我感到困惑,我在构造函数中调用了 doConfigure()并且记录器已经正确配置,为什么我在main函数中仍然出现这个错误?我是否需要在每次写日志之前调用doConfigure()?
以下是我的代码:
class LogCp
{
public:
~LogCp();
static LogCp& GetInstance();
static Logger _logger;
private:
LogCp();
LogCp(const LogCp&) = delete;
void operator =(LogCp const&);
};
Logger LogCp::_logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("filelogger"));
//Logger LogCp::_logger = log4cplus::Logger::getRoot();
LogCp::LogCp()
{
log4cplus::Initializer initializer;
try {
PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("E:\log4cplus.properties"));
//_logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("filelogger"));
LOG4CPLUS_WARN(_logger, LOG4CPLUS_TEXT("logging...."));
}
catch (...) {
LOG4CPLUS_FATAL(_logger, LOG4CPLUS_TEXT("Exception occured..."));
}
}
LogCp& LogCp::GetInstance()
{
static LogCp vLogCp;
return vLogCp;
}
LogCp::~LogCp()
{
}
主要功能:
void logInitial()
{
LogCp::GetInstance();
}
int main(int argc, wchar_t* argv[])
{
logInitial();
LOG4CPLUS_WARN(LogCp::GetInstance()._logger, LOG4CPLUS_TEXT("test"));
}
在构造函数中可以正确登录,但是在main()函数中不会登录"test",除非我在LOG4CPLUS_WARN.why?
之前再次添加doConfigure()函数
您需要先配置库,然后再尝试使用它。 doConfigure()
函数设置附加程序,没有它就没有输出。
在你的 ctor 中使用 log4cplus::Initializer initializer;
是错误的。它将初始化库并在构造函数结束时取消初始化。 initializer
对象必须在库的整个使用过程中存在。
我在自定义classLogCp的构造函数中配置了这个log4cplus的静态对象,在这个构造函数中我写了一些测试代码,它可以正确地将信息导出到指定的文件,但是当我调用GetInstance 函数,它将 return 唯一的对象,它无法写入日志,错误消息是找不到 filelogger.It 的附加程序让我感到困惑,我在构造函数中调用了 doConfigure()并且记录器已经正确配置,为什么我在main函数中仍然出现这个错误?我是否需要在每次写日志之前调用doConfigure()? 以下是我的代码:
class LogCp
{
public:
~LogCp();
static LogCp& GetInstance();
static Logger _logger;
private:
LogCp();
LogCp(const LogCp&) = delete;
void operator =(LogCp const&);
};
Logger LogCp::_logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("filelogger"));
//Logger LogCp::_logger = log4cplus::Logger::getRoot();
LogCp::LogCp()
{
log4cplus::Initializer initializer;
try {
PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("E:\log4cplus.properties"));
//_logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("filelogger"));
LOG4CPLUS_WARN(_logger, LOG4CPLUS_TEXT("logging...."));
}
catch (...) {
LOG4CPLUS_FATAL(_logger, LOG4CPLUS_TEXT("Exception occured..."));
}
}
LogCp& LogCp::GetInstance()
{
static LogCp vLogCp;
return vLogCp;
}
LogCp::~LogCp()
{
}
主要功能:
void logInitial()
{
LogCp::GetInstance();
}
int main(int argc, wchar_t* argv[])
{
logInitial();
LOG4CPLUS_WARN(LogCp::GetInstance()._logger, LOG4CPLUS_TEXT("test"));
}
在构造函数中可以正确登录,但是在main()函数中不会登录"test",除非我在LOG4CPLUS_WARN.why?
之前再次添加doConfigure()函数您需要先配置库,然后再尝试使用它。 doConfigure()
函数设置附加程序,没有它就没有输出。
在你的 ctor 中使用 log4cplus::Initializer initializer;
是错误的。它将初始化库并在构造函数结束时取消初始化。 initializer
对象必须在库的整个使用过程中存在。