2016-11-29 1 views
0

このlog4cplusの静的オブジェクトをカスタムクラスのLogCpのコンストラクタ関数で設定します。このコンストラクタでは、テストコードをいくつか記述して情報を指定したファイルに正しくエクスポートできます唯一のオブジェクトを返すGetInstance funtionを呼び出すと、ログを書き込むことができず、エラーメッセージがfilelogger.Itのアペンダを見つけられないので、私はコンストラクタとロガーでdoConfigure()を呼び出していました私がログを書き込む前に毎回doConfigure()を呼び出す必要がありますか?続き は私のコードです:カスタムシングルトンクラスでlog4cplusを使用する方法

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")); 
} 

それはコンストラクタ関数で正しくログインできますが、私はは、doConfigureを追加しない限り、それはmain()関数で「テスト」をログに記録しません()関数はLOG4CPLUS_WARN.whyの前に再び機能しますか?

答えて

0

ライブラリを使用する前に設定する必要があります。 doConfigure()ファンクションはアペンダーを設定します。このアペンダーを使用しないと出力は出力されません。

log4cplus::Initializer initializer;をあなたのctorに使用すると間違っています。それはライブラリを初期化し、コンストラクタの終わりにそれを初期化しません。 initializerオブジェクトは、ライブラリの使用を通じて存続する必要があります。

+0

あなたのanwserのおかげで、私は "log4cplus :: Initializer initializer"を削除してから、すべてがOKです。アサーションやerrormsgはありませんが、すべてのレコードはプロセスの最後に記録されます。私のプログラムでは、DLL C CRTを使用していないと警告していますので、使用する前にinitialize()を一度呼び出す必要があります。シングルトンクラスでlog4cplusを使用するにはどうすればよいですか?@wilx – TimGallin

関連する問題