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. Leetcode--easy系列2

    #14 Longest Common Prefix Write a function to find the longest common prefix string amongst an array ...

  2. Android开发之控制手机音频

    本实例通过MediaPlayer播放一首音乐并通过AudioManager控制手机音频.关于AudioManager的具体解释可參照:Android开发之AudioManager(音频管理器)具体解释 ...

  3. UI_KVC赋值

    使用KVC对person的属性进行赋值 [aperson setValue:@"yadong" forKey:@"name"]; [aperson setVal ...

  4. c++面向对象程序设计 课后题 答案 谭浩强 第四章

    c++面向对象程序设计课后题答案 谭浩强 第四章 1: #include <iostream> using namespace std; class Complex {public: Co ...

  5. 网易NAPM Andorid SDK实现原理--转

    原文地址:https://neyoufan.github.io/2017/03/10/android/NAPM%20Android%20SDK/ NAPM 是网易的应用性能管理平台,采用非侵入的方式获 ...

  6. java实现sql批量插入参数

    背景: 需要更新一些不规范的时间格式,如将某个时间格式化为yy-MM-dd,实际上为 yy-MM-dd hh:mm:ss,并且需要提供回滚脚本. 例如:规范化时间的脚本如下: ,) WHERE tes ...

  7. android studio开发去掉titlebar

    android:theme="@style/AppTheme"换成android:theme="@style/Theme.AppCompat.NoActionBar&qu ...

  8. hiho 1476 - 矩形计数 容斥

    题目链接 如图所示,在由N行M列个单位正方形组成的矩形中,有K个单位正方形是黑色的,其余单位正方形是白色的. 你能统计出一共有多少个不同的子矩形是完全由白色单位正方形组成的吗? ----------- ...

  9. AVL树,红黑树,B树,B+树,Trie树都分别应用在哪些现实场景中?

    AVL树: 最早的平衡二叉树之一.应用相对其他数据结构比较少.windows对进程地址空间的管理用到了AVL树. 红黑树: 平衡二叉树,广泛用在C++的STL中.如map和set都是用红黑树实现的. ...

  10. Docker-镜像的操作命令

    2.镜像在Ubuntu中的一些命令 (1)docker image ls 列出镜像 能够罗列出docker中所以的镜像所在的仓库.镜像标签.镜像ID.镜像的创建日期.镜像的大小等等信息. (2)doc ...