2016-04-30 3 views
1

私のアプリケーションにはいくつかのコンポーネントがあり、それぞれのコンポーネントが別々のファイルにログを書き込むようにしたい。Boost複数のファイルをローテーションでログする

私は「テキストマルチファイルバックエンド」を使いたいと思っていましたが、ドキュメンテーションによれば、それはファイルの回転をサポートしていません。

私の考えは、ログクラスを実装し、各コンポーネントのインスタントを作成し、それらをマップに保存して、マップを使用して正しいロガーインスタンス(名前に従って)を取得し、ログに記録することでした正しいファイルにコピーしてください。

私はこれを行っていますが、これは私のためには機能しません。すべてのファイルで同じメッセージが表示されます(これはグローバルロガーと思われます)。

これは私のコードのドラフトです:

logger.h

struct LogInfo{ 
    std::string log_path; 
    LogLevel log_level; 
    long log_file_size; 
    int log_file_amount; 
}; 

LogLevel stringToLogLevel(const std::string &fileType); 

class Logger { 
public: 
    Logger(const LogInfo &log_info, const std::string &component_name); 
    void writeToLog(LogLevel log_level, const std::string &scope, const std::string &message); 
private: 
    void scanForFiles(const std::string &path, const std::string &component_name); 

    std::string pid; 
    std::string log_file_name; 
    boost::log::sources::severity_logger<boost::log::trivial::severity_level> boost_severity_logger; 
}; 

logger.cpp

using namespace boost::log; 
using namespace std; 
namespace fs = boost::filesystem; 

LogLevel stringToLogLevel(const string &fileType) { 
    if (fileType == "TRACE") 
     return LOGLEVEL_TRACE; 
    if (fileType == "DEBUG") 
     return LOGLEVEL_DEBUG; 
    if (fileType == "INFO") 
     return LOGLEVEL_INFO; 
    if (fileType == "WARNING") 
     return LOGLEVEL_WARNING; 
    if (fileType == "ERROR") 
     return LOGLEVEL_ERROR; 
    throw invalid_argument("Unknown file type"); 
} 

trivial::severity_level logLevelToBoostLogLevel(const LogLevel log_level) { 
    if (log_level == LOGLEVEL_TRACE) 
     return trivial::trace; 
    if (log_level == LOGLEVEL_DEBUG) 
     return trivial::debug; 
    if (log_level == LOGLEVEL_INFO) 
     return trivial::info; 
    if (log_level == LOGLEVEL_WARNING) 
     return trivial::warning; 
    if (log_level == LOGLEVEL_ERROR) 
     return trivial::error; 
    throw invalid_argument("Unknown log type"); 
} 

Logger::Logger(const LogInfo &log_info, const string &component_name) { 
    scanForFiles(log_info.log_path, component_name); 
    stringstream s; 
    s << log_info.log_path << component_name << "_%N.log"; 
    add_file_log(
     keywords::file_name = s.str(), 
     keywords::rotation_size = log_info.log_file_size, 
     keywords::max_size = log_info.log_file_amount * log_info.log_file_size, 
     keywords::target = log_info.log_path, 
     keywords::open_mode = std::ios::out | std::ios::app, 
     keywords::auto_flush = true, 
     keywords::format = 
     expressions::format("[%1%] [%2%] [%3%] [%4%] %5%") 
     % expressions::format_date_time<boost::posix_time::ptime>("TimeStamp", "%Y-%m-%d %H:%M:%S.%f") 
     % expressions::attr<unsigned int>("ThreadID") 
     % expressions::attr<string>("Scope") 
     % trivial::severity 
     % expressions::smessage 
    ); 

    trivial::severity_level requested_level = logLevelToBoostLogLevel(log_info.log_level); 
    core::get()->set_filter(
     trivial::severity >= requested_level 
    ); 
    add_common_attributes(); 
} 

void Logger::writeToLog(LogLevel log_level, const std::string &scope, const std::string &message) { 
    BOOST_LOG_SCOPED_THREAD_ATTR("ThreadID", attributes::constant<unsigned int>(OS::getTid())); 
    BOOST_LOG_SCOPED_THREAD_ATTR("Scope", attributes::constant<string>(scope)); 
    BOOST_LOG_SEV(this->boost_severity_logger, logLevelToBoostLogLevel(log_level))<< message.c_str(); 
} 

は、それは私が欲しいものを達成することは可能ですか?

答えて

1

thisを参照してください。とりわけ、チャネルとフィルタを使用して必要なものを達成する方法について説明しています。

+0

これはまさに私が必要なものです。ありがとうございます。 –

関連する問題