我在自定义类LogCp的构造函数中配置了此log4cplus的静态对象,并在此构造函数中编写了一些测试代码,它可以将信息正确导出到指定文件,但是当我调用GetInstance函数时,它将返回唯一的对象,它不能写日志,错误消息是找不到filelogger的附加程序。这使我感到困惑,我在构造函数中调用了doConfigure(),并且正确配置了logger,为什么在此我仍然遇到此错误主要功能?我每次写日志之前都需要调用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"));
}


它可以正确地登录到构造函数中,但是除非在LOG4CPLUS_WARN之前再次添加doConfigure()函数,否则它不会在main()函数中记录“测试”。为什么?

最佳答案

在尝试使用该库之前,需要对其进行配置。 doConfigure()函数设置追加器,没有这些追加器将没有输出。

在ctor中使用log4cplus::Initializer initializer;是错误的。它将初始化库,并在构造函数的末尾对其进行初始化。 initializer对象必须在整个库使用期间都存在。

10-04 18:31