Boost Log 基本使用方法
flyfish 2014-11-5
依据boost提供的代码演示样例,学习Boost Log 的基本使用方法
前提
boost版本号boost_1_56_0
演示样例代码目录 boost_1_56_0libslogexampleasic_usage
使用的单词非常形象。整个过程就像流水一样
如果要输出的日志比作水
水 (Hello, World!)
水槽 (sink)
流向哪里 (console,file)
从哪里取 (source)
水的等级 (severity level)
过滤输出 (filter)
格式输出 (format)
各部分连接者(core)
演示样例
从上到下依次分析
一 日志严重性等级
enum severity_level
{
normal,
notification,
warning,
error,
critical
};
二 日志等级输出
template< typename CharT, typename TraitsT >
inline std::basic_ostream< CharT, TraitsT >& operator<< (
std::basic_ostream< CharT, TraitsT >& strm, severity_level lvl)
{
...
}
输出已经定义的等级描写叙述,日志等级的数值与字符串一一相应,假设在enum severity_level假设未定义则输出数值。
[int __cdecl wmain(int,char *[]) (文件路径:代码行)] <warning> A warning severity message, will pass to the file
2014-11-05, 19:46:19.518082 [00:00:00]
[int __cdecl wmain(int,char *[]) (文件路径:代码行)] <error> An error severity message, will pass to the file
2014-Nov-05 19:51:30.268856: A normal severity message, will not pass to the file
2014-Nov-05 19:51:30.275856: A warning severity message, will pass to the file
2014-Nov-05 19:51:30.284857: An error severity message, will pass to the file
flyfish 2014-11-5
依据boost提供的代码演示样例,学习Boost Log 的基本使用方法
前提
boost版本号boost_1_56_0
演示样例代码目录 boost_1_56_0libslogexampleasic_usage
使用的单词非常形象。整个过程就像流水一样
如果要输出的日志比作水
水 (Hello, World!)
水槽 (sink)
流向哪里 (console,file)
从哪里取 (source)
水的等级 (severity level)
过滤输出 (filter)
格式输出 (format)
各部分连接者(core)
演示样例
#include <iostream> #include <boost/log/common.hpp> #include <boost/log/expressions.hpp> #include <boost/log/utility/setup/file.hpp> #include <boost/log/utility/setup/console.hpp> #include <boost/log/utility/setup/common_attributes.hpp> #include <boost/log/attributes/timer.hpp> #include <boost/log/attributes/named_scope.hpp> #include <boost/log/sources/logger.hpp> #include <boost/log/support/date_time.hpp> namespace logging = boost::log; namespace sinks = boost::log::sinks; namespace attrs = boost::log::attributes; namespace src = boost::log::sources; namespace expr = boost::log::expressions; namespace keywords = boost::log::keywords; using boost::shared_ptr; // Here we define our application severity levels. enum severity_level { normal, notification, warning, error, critical }; // The formatting logic for the severity level template< typename CharT, typename TraitsT > inline std::basic_ostream< CharT, TraitsT >& operator<< ( std::basic_ostream< CharT, TraitsT >& strm, severity_level lvl) { static const char* const str[] = { "normal", "notification", "warning", "error", "critical" }; if (static_cast< std::size_t >(lvl) < (sizeof(str) / sizeof(*str))) strm << str[lvl]; else strm << static_cast< int >(lvl); return strm; } int _tmain(int argc, char* argv[]) { // This is a simple tutorial/example of Boost.Log usage // The first thing we have to do to get using the library is // to set up the logging sinks - i.e. where the logs will be written to. logging::add_console_log(std::clog, keywords::format = "%TimeStamp%: %Message%"); // One can also use lambda expressions to setup filters and formatters logging::add_file_log ( "sample.log", keywords::filter = expr::attr< severity_level >("Severity") >= warning, keywords::format = expr::stream << expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d, %H:%M:%S.%f") << " [" << expr::format_date_time< attrs::timer::value_type >("Uptime", "%O:%M:%S") << "] [" << expr::format_named_scope("Scope", keywords::format = "%n (%f:%l)") << "] <" << expr::attr< severity_level >("Severity") << "> " << expr::message /* keywords::format = expr::format("%1% [%2%] [%3%] <%4%> %5%") % expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d, %H:%M:%S.%f") % expr::format_date_time< attrs::timer::value_type >("Uptime", "%O:%M:%S") % expr::format_named_scope("Scope", keywords::format = "%n (%f:%l)") % expr::attr< severity_level >("Severity") % expr::message */ ); // Also let's add some commonly used attributes, like timestamp and record counter. logging::add_common_attributes(); logging::core::get()->add_thread_attribute("Scope", attrs::named_scope()); BOOST_LOG_FUNCTION(); // Now our logs will be written both to the console and to the file. // Let's do a quick test and output something. We have to create a logger for this. src::logger lg; // And output... BOOST_LOG(lg) << "Hello, World!"; // Now, let's try logging with severity src::severity_logger< severity_level > slg; // Let's pretend we also want to profile our code, so add a special timer attribute. slg.add_attribute("Uptime", attrs::timer()); BOOST_LOG_SEV(slg, normal) << "A normal severity message, will not pass to the file"; BOOST_LOG_SEV(slg, warning) << "A warning severity message, will pass to the file"; BOOST_LOG_SEV(slg, error) << "An error severity message, will pass to the file"; return 0; }
从上到下依次分析
一 日志严重性等级
enum severity_level
{
normal,
notification,
warning,
error,
critical
};
二 日志等级输出
template< typename CharT, typename TraitsT >
inline std::basic_ostream< CharT, TraitsT >& operator<< (
std::basic_ostream< CharT, TraitsT >& strm, severity_level lvl)
{
...
}
输出已经定义的等级描写叙述,日志等级的数值与字符串一一相应,假设在enum severity_level假设未定义则输出数值。
std::basic_ostream对全部的内建类型,进行了重载,输入各种内置类型
重载operator <<,使得自定的用户定义类型severity_level 集成到IOStream library中
IOStream library的类都带有两个參数,当中一个是字符的类型,一个是与字符类型相关的信息
就像std::cout一样输出各种类型,编译器自己会进行正确的推导输出的什么类型。
static const char* const 表示数组里面的指针不可改变 并且指针所指向的字符串也不可改变
三 日志输出位置
logging::add_console_log
日志输出到控制台
logging::add_file_log
日志输出到文件
四 定义源。像std::cout一样输出
src::logger lg;
BOOST_LOG(lg) << "Hello, World!";五 结果
文件的输出
2014-11-05, 19:46:19.513082 [00:00:00][int __cdecl wmain(int,char *[]) (文件路径:代码行)] <warning> A warning severity message, will pass to the file
2014-11-05, 19:46:19.518082 [00:00:00]
[int __cdecl wmain(int,char *[]) (文件路径:代码行)] <error> An error severity message, will pass to the file
控制台的输出
2014-Nov-05 19:51:30.261856: Hello, World!2014-Nov-05 19:51:30.268856: A normal severity message, will not pass to the file
2014-Nov-05 19:51:30.275856: A warning severity message, will pass to the file
2014-Nov-05 19:51:30.284857: An error severity message, will pass to the file