Boost Log 基本使用方法

flyfish 2014-11-5






依据boost提供的代码演示样例,学习Boost Log 的基本使用方法





前提

boost版本号boost_1_56_0

演示样例代码目录 boost_1_56_0\libs\log\example\basic_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

Boost Log 基本使用方法的更多相关文章

  1. boost.log要点笔记

    span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...

  2. boost.asio与boost.log同时使用导致socket不能正常收发数据

    现象: 1. 没有使用boost.log前能正常收发数据 2.加入boost.log后async_connect没有回调 fix过程: 1. gdb调试发现程序block在pthread_timed_ ...

  3. Boost.log

    =================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载  请通过右 ...

  4. Android开发华为手机无法看log日志解决方法

    Android开发华为手机无法看log日志解决方法 上班的时候,由于开发工具由Eclipse改成Android Studio后,原本的华为手机突然无法查看崩溃日志了,大家都知道,若是无法查看日志要它毛 ...

  5. Android开发过程中在sh,py,mk文件中添加log信息的方法

    Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...

  6. boost.log在项目中应用

    //头文件#pragma once #include <string> #include <boost/log/trivial.hpp> using std::string; ...

  7. 编译boost.log模块遇到的一些问题

    线上日志用到的是日志库,在全局有一个锁,导致在高并发的时候,容易因为锁竞争问题导致时延.在某些情况下,会因为同一个用户,同时访问某个变量,导致读写冲突使线上服务整体core掉(考虑到请求的间隔,为了应 ...

  8. Boost log中的几个问题

    1. 使用动态库时,要定义 BOOST_LOG_DYN_LINK  或者 BOOST_ALL_DYN_LINK 否则会出现如下错误: CMakeFiles/xxxx.dir/xxxx.cpp.o: I ...

  9. C++ 日志库 boost::log 以及 glog 的对比

    日志能方便地诊断程序原因.统计程序运行数据,是大型软件系统必不可少的组件之一.本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog . 设计 b ...

随机推荐

  1. Hdu oj 1017 A Mathematical Curiosity

    题目:pid=1017">点击打开链接 #include<stdio.h> int main() { int t; scanf("%d",&t) ...

  2. uva 10061(数学)

    题解:题目要在b进制下输出的是一个数字阶乘后有多少个零,然后输出一共同拥有多少位.首先计算位数,log(n)/log(b) + 1就是n在b进制下有多少位,而log有个公式就是log(M×N) = l ...

  3. the rendering library is more recent than your version of android studio

    近期更新了自己Android Studio中的SDK到最新版本号,AS的一部分配置改动了. 然后 在打开布局文件的时候 会出现 渲染错误 Rendering problem the rendering ...

  4. iOS 常见面试图总结2

    1.请简述storyboard和xib的差别? 一个project中.能够有多个xib文件,一个xib文件相应着一个视图类控制器,和多个视图. 然而.使用 storyboard时,一个project仅 ...

  5. 具体验证身份证号码规则和姓名(汉字)的java代码

    一.验证汉字的正則表達式  /** 是否是汉字的正则 */  private String regexIsHanZi = "[\\u4e00-\\u9fa5]+";   * @pa ...

  6. java基础——transient

    今天在看struts1源代码的时候,发如今ActionForm中首先声明了两个transient类型的protected变量. 之前没有接触过该transient类型,所以就查了查. transien ...

  7. Android自己定义控件系列三:自己定义开关button(二)

    接上一篇自己定义开关button(一)的内容继续.上一次实现了一个开关button的基本功能.即自己定义了一个控件.开关button,实现了点击切换开关状态的功能.今天我们想在此基础之上.进一步实现触 ...

  8. angularjs1-7,供应商

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  9. Caffe_Example之训练mnist

    0.参考文献 [1]caffe官网<Training LeNet on MNIST with Caffe>; [2]薛开宇<读书笔记4学习搭建自己的网络MNIST在caffe上进行训 ...

  10. JVM源码分析之javaagent原理完全解读--转

    原文地址:http://www.infoq.com/cn/articles/javaagent-illustrated 概述 本文重点讲述javaagent的具体实现,因为它面向的是我们Java程序员 ...