2017-03-03 8 views
0

私はブースト1.63を使ってグローバルロガーを実装しました。プログラムは、ログ・ファイルが(プログラムを再度実行されても)oldLogsディレクトリに移動されていないと/ var(例はsudo殺す-9 pidのか電源オフのため)が予期せず終了するとブーストログ処理の電源オフシナリオ

BOOST_LOG_GLOBAL_LOGGER_INIT(my_logger, src::severity_logger_mt<severity_level>) 
{ 
    typedef sinks::synchronous_sink<sinks::text_file_backend> file_sink; 
    boost::shared_ptr<file_sink> sink(new file_sink(
    keywords::file_name = "/var/log/testApp/%Y%m%d_%H%M%S_testApp.log", 
    keywords::rotation_size = 5 * 1024 * 1024, 
    keywords::auto_flush = true)); 

    sink->locked_backend()->set_file_collector(sinks::file::make_collector(
    keywords::target = "/var/log/testApp/oldLogs", 
    keywords::max_size = 5 * 1024 * 1024 * 2, 
    keywords::min_free_space = 5 * 1024 * 1024 * 2, 
    keywords::max_files = 2)); 

    sink->locked_backend()->scan_for_files(); 

    sink->set_formatter(
    expr::format("[%1%]<%2%> : %3%") % 
    expr::attr<boost::posix_time::ptime>("TimeStamp") % 
    expr::attr<severity_level>("Severity") % 
    expr::smessage); 

    logging::core::get()->add_sink(sink); 
    logging::core::get()->add_global_attribute("TimeStamp", attrs::local_clock()); 

    src::severity_logger_mt<severity_level> slg; 
    return slg; 
} 

:ここでは初期化され/ log/testAppディレクトリには多くのログファイルが含まれている可能性があります。

このようなシナリオを処理することは可能ですか?

答えて

1

オフラインの場合のみ。たとえば、次回の起動時にスクリプトを自動実行して、半分書きログファイルをターゲットディレクトリに移動することができます。または、次回のアプリケーション起動時にこれを行うこともできます。この場合、ログファイルを追加モードで開くと(つまり、名前付きパラメータkeywords::open_mode = std::ios::appをシンクコンストラクタに渡して)シンクのバックエンドですぐにrotate_fileを呼び出すとBoost.Logが役に立ちます。これにより、アプリケーション起動時に空でないログファイルがローテーションされますが、ログファイルに実際に追加することはできません。

更新:

私はあなたのログファイル名にタイムスタンプを使用していることに気付きました。この場合、Boost.Logでログファイルを回転させる方法は、アプリケーションが次に起動するときに別の名前のファイルを開く可能性があるため、機能しません。タイムスタンプが重要な場合は、残りの唯一の選択肢はスクリプトです。