読者です 読者をやめる 読者になる 読者になる

Boost.Log 追記モード・ユーザー定義の severity

C++ Boost

Boost.Logはファイルに書き出せるわけですが、追記モードも可能です。
ついでに、自分で定義した severity を書きだす方法もどーぞ。

#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/attributes.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/support/date_time.hpp>

namespace logging = boost::log;
namespace attrs = boost::log::attributes;
namespace keywords = boost::log::keywords;
namespace sinks = boost::log::sinks;
namespace expr = boost::log::expressions;

enum severity_level
{
    debug,
    warning,
    error,
    critical
};
struct severity_tag;

std::ostream& operator<< ( std::ostream& strm, severity_level level )
{
    static const char* strs[] =
    {
        "debug",
        "warning",
        "error",
        "critical"
    };

    if ( static_cast< std::size_t >( level ) < sizeof( strs ) / sizeof( *strs ) )
        strm << strs[level];
    else
        strm << static_cast< int >( level );

    return strm;
}

int main()
{
    logging::register_simple_formatter_factory< severity_level, char >( "Severity" );
    logging::add_file_log(
        keywords::file_name = "logs/%Y%m%d.log",
        keywords::time_based_rotation = sinks::file::rotation_at_time_point( 0, 0, 0 ),
        keywords::format = 
        (
            expr::stream
                << expr::attr< unsigned int >( "LineID" ) << ":"
                << "[" << expr::format_date_time< boost::posix_time::ptime >( "TimeStamp", "%Y-%m-%d %H:%M:%S" )
                << "][" << expr::attr< severity_level, severity_tag >( "Severity" )
                << "]: " << expr::smessage
        ),
        // 又は、単に
        // keywords::format = "%LineID%:[%TimeStamp%][%Severity%]:%Message%"
        keywords::open_mode = (std::ios::out | std::ios::app) // std::ios のがそのまま使える
    );
    logging::sources::severity_logger<severity_level> slg;
    logging::add_common_attributes(); // LineID を使えるようにする
    logging::core::get()->add_global_attribute( "TimeStamp", attrs::local_clock() );
    BOOST_LOG_SEV( slg, debug ) << "hoge";
    BOOST_LOG_SEV( slg, error ) << "bar";
    BOOST_LOG_SEV( slg, warning ) << "piyo";
    BOOST_LOG_SEV( slg, critical ) << "foo";
}

ログファイルがこちら

1:[2013-08-02 19:15:24][debug]: hoge
2:[2013-08-02 19:15:24][error]: bar
3:[2013-08-02 19:15:24][warning]: piyo
4:[2013-08-02 19:15:24][critical]: foo

severity に関しては他にも方法あるかも。多分これが一番楽だと思います。
Boost.Logのリファレンス適当に読んだだけなので問題があったら言ってください。