Boost::Log::Tutorial::Setting up sinks

Posted Droplet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Boost::Log::Tutorial::Setting up sinks相关的知识,希望对你有一定的参考价值。

Setting up sinks

有时候,trivial(简单的)logging不能满足要求。例如,想要更多的处理日志处理,而不是简单地打印出来。为此,必须自己构建自定义的sinks,并且将它们注册到core中。这步操作通常在只在程序的开始执行一次。

注意
特别要提醒的是,在前面的章节中我们并没有初始化任何sinks,但trivial logging任然能够正常运行。这是因为,在用户没有设置任何sinks时,log库会使用一个默认的sink。这个默认的sink一般来说是将日志按照固定的格式打印到console,就像我们在前面所看到的一样。提供这样一个默认sink,是为了在没有做任何初始化时,trivial logging也能立即使用。一旦core中添加了任何其他的sinks,默认的sink就不再起作用。但任然能够使用trivial logging的宏。
File logging unleashed

作为开始,下面是如何初始化一个log,让其出输出到一个文件:

void init()
{
    logging::add_file_log("sample.log");

    logging::core::get()->set_filter
    (
        logging::trivial::severity >= logging::trivial::info
    );
}

 增加的一行是add_file_log函数。正如名字所示,这个函数初始化一个logging sink,使其保存日志记录到一个文件中。这个函数还接受一些自定义选项,例如文件轮转rotation周期和大小限制。例如:

void init()
{
    logging::add_file_log
    (
        keywords::file_name = "sample_%N.log",                  //1
        keywords::rotation_size = 10 * 1024 * 1024,             //2
        keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),  //3
        keywords::format = "[%TimeStamp%]: %Message%" //4
    );

    logging::core::get()->set_filter
    (
        logging::trivial::severity >= logging::trivial::info
    );
}    

1. 文件名模板
2. rotation在每个文件到达10m
3.             或到达0点
4. 日志格式

完整代码:

技术分享图片
/*
 *          Copyright Andrey Semashev 2007 - 2015.
 * Distributed under the Boost Software License, Version 1.0.
 *    (See accompanying file LICENSE_1_0.txt or copy at
 *          http://www.boost.org/LICENSE_1_0.txt)
 */

#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks/text_file_backend.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
#include <boost/log/sources/severity_logger.hpp>
#include <boost/log/sources/record_ostream.hpp>

namespace logging = boost::log;
namespace src = boost::log::sources;
namespace sinks = boost::log::sinks;
namespace keywords = boost::log::keywords;

#if 0

//[ example_tutorial_file_simple
void init()
{
    logging::add_file_log("sample.log");

    logging::core::get()->set_filter
    (
        logging::trivial::severity >= logging::trivial::info
    );
}
//]

// We need this due to this bug: https://svn.boost.org/trac/boost/ticket/4416
//[ example_tutorial_file_advanced_no_callouts
void init()
{
    logging::add_file_log
    (
        keywords::file_name = "sample_%N.log",
        keywords::rotation_size = 10 * 1024 * 1024,
        keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),
        keywords::format = "[%TimeStamp%]: %Message%"
    );

    logging::core::get()->set_filter
    (
        logging::trivial::severity >= logging::trivial::info
    );
}
//]

#else

//[ example_tutorial_file_advanced
void init()
{
    logging::add_file_log
    (
        keywords::file_name = "sample_%N.log",                                        /*< file name pattern >*/
        keywords::rotation_size = 10 * 1024 * 1024,                                   /*< rotate files every 10 MiB... >*/
        keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0), /*< ...or at midnight >*/
        keywords::format = "[%TimeStamp%]: %Message%"                                 /*< log record format >*/
    );

    logging::core::get()->set_filter
    (
        logging::trivial::severity >= logging::trivial::info
    );
}
//]

#endif

int main(int, char*[])
{
    init();
    logging::add_common_attributes();

    using namespace logging::trivial;
    src::severity_logger< severity_level > lg;

    BOOST_LOG_SEV(lg, trace) << "A trace severity message";
    BOOST_LOG_SEV(lg, debug) << "A debug severity message";
    BOOST_LOG_SEV(lg, info) << "An informational severity message";
    BOOST_LOG_SEV(lg, warning) << "A warning severity message";
    BOOST_LOG_SEV(lg, error) << "An error severity message";
    BOOST_LOG_SEV(lg, fatal) << "A fatal severity message";

    return 0;
}
View Code

可以看到,函数的可选参数是以命名方式传递的。在log库的其他地方,也有许多这种处理方式。你会习惯的。这些参数的意义基本上都能自我解释,并且在手册中有说明(此处应有链接)。本节将介绍这个和其他一些初始化函数。

注意
你可以注册不止一个sink。每个sink都会独立地接收并处理传给它的日志

以上是关于Boost::Log::Tutorial::Setting up sinks的主要内容,如果未能解决你的问题,请参考以下文章