boost.log要点笔记
span.kw { color: #007020; font-weight: bold; }
code > span.dt { color: #902000; }
code > span.dv { color: #40a070; }
code > span.bn { color: #40a070; }
code > span.fl { color: #40a070; }
code > span.ch { color: #4070a0; }
code > span.st { color: #4070a0; }
code > span.co { color: #60a0b0; font-style: italic; }
code > span.ot { color: #007020; }
code > span.al { color: #ff0000; font-weight: bold; }
code > span.fu { color: #06287e; }
code > span.er { color: #ff0000; font-weight: bold; }
-->
常用简写:
namespace logging = boost::log;
namespace src = boost::log::sources;
namespace expr = boost::log::expressions;
namespace sinks = boost::log::sinks;
namespace attrs = boost::log::attributes;
namespace keywords = boost::log::keywords;
要点:
- 结构图要牢记在心;
trivial头文件可用于一般的控制台输出,日志等级被定义在改头文件;- 全局日志等级过滤使用
logging::core::get()->set_filter(); - 如果不仅仅需要简单的控制台输出,这时候就要添加
sink,使用logging::add_file_log可添加文件sink后端,格式如下:
1 |
|
除了这种语法外,也可以建立sinks::text_file_backend后端,用之初始化一个sink。 file rotation的选项有很多,可以指定日期、时间间隔、文件大小,甚至可以指定自己的谓词。 此外,可以设置在建立新文件后首先执行(sink->locked_backend()->set_open_handler(xx)),以及rotation之前最后执行的语句。 可以综合管理这些日志文件,限制输出文件夹,日志总大小限制,以及最低磁盘空间限制。如下:
1 |
|
如果多个后端制定了相同的存放文件夹,限制取其中最严格的,另外,注意避免不同后端日志的命名冲突问题。 注意使用sink->locked_backend()->scan_for_files() 来扫描其他实例建立的日志文件。
以上都是使用程序本身使用单日志文件的情况,如果需要根据请求的不同将消息分发到不同的文件,可以使用sinks::text_mutlifile_backend。该后端常用于多线程调试。
除了文件后端,更常用的是文本流后端
sinks::text_ostream_backend,与别的后端不同,文本流后端可以添加多个输出对象,这些对象由于都在同一个sink中,所以输出格式是一样的,这种做法的性能比添加文件后端更高,但是会失去对文件的控制能力。对于大规模应用程序,为了方便查看记录,各模块的日志应该相互独立,因此一个logger一般是不够的,我们需要自己建立logger。logger的建立方法很简单,new一个src::logger就可以了…
如果真的只需要一个logger,除了使用前面提到的trivial中的宏以外,也可以用BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger,src::logger_mt),自己定义属于自己的全局logger。然后在需要的时候使用src::logger_mt& lg=my_logger::get()获得logger的单例引用(这里最好是线程安全的logger,显然)。
logger的使用方法:
1 |
|
以上可以简化成一个宏:BOOST_LOG(lg)<<"Hello World"
attribute是log record的附加信息,不同于一般的消息记录,属性可以被单独拿出来处理,作为某种过滤条件,或者其他使用。属性分为全局属性,特定线程属性和特定源的属性。
常用的属性,如时间戳、计数器,boost.log都已经有实现好的版本,直接使用logging::add_common_attributes() 可以一次性获得LineID, TimeStamp, ProcessID, ThreadID 这些常用属性(单线程程序没有线程ID)。
可以自己注册安全等级,定义相关枚举,然后使用其作为src::serverity_logger<>的模板参数初始化,就得到了自定义Severity属性的logger。这种logger可以使用BOOST_LOG_SEV(logger,serverity)来记录。
特定范围的属性可以用来做一些特殊日志,比如需要评估性能的地方可以使用BOOST_LOG_SCOPED_THREAD_ATTR("Timeline",attrs::timer());注册一个时间线标签。
此外,可以给属性定义占位符,相当于注册为关键字,方便在流中使用。关于属性的函数大多定义在expr命名空间里面。
- 格式化输出消息,前文有
set_formatter的用法。格式化消息可以使用stl格式expr::stream<<xxx,也可以使用boost::format格式,即expr::format("%1%)%xxx这种。
为了取得最大灵活性,可以自定义一个formatter。
过滤子,如前文,可以使用
sink.set_filter来设置,可以使用的过滤条件包括布尔表达式和lambda表达式等,如果想要确定有没有某个属性,可使用expr::has_attr()。宽字符。使用windows的话,这块算是最恶心的部分了
辅助函数
boost.log定义了大量辅助函数实现常用功能。
logging::add_console_log()可以直接添加控制台sink,返回boost::shared_ptr<sinks::synchronous_sink<sinks::text_ostream_backend>>,可利用返回值设置过滤器或其他属性。
logging::add_file_log(),前文已经提过,可以直接得到文件sink…
最后logging::add_common_attributes可以获得常用属性,前文也有详解。
示例
完全封装boost.log的工程量比较大,不过对于小规模工程,使用一个初始化函数就足够了,但是这会导致整个项目与boost深度耦合。
1 |
|
实现:
1 |
|
使用:
调用g_initlog()初始化一次以后,在任意位置声明logger,使用宏BOOST_LOG_SEV(logger,SeverityLevel)<<"..."来写入日志即可。
boost.log要点笔记的更多相关文章
- boost.asio与boost.log同时使用导致socket不能正常收发数据
现象: 1. 没有使用boost.log前能正常收发数据 2.加入boost.log后async_connect没有回调 fix过程: 1. gdb调试发现程序block在pthread_timed_ ...
- Boost.log
=================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载 请通过右 ...
- boost.log在项目中应用
//头文件#pragma once #include <string> #include <boost/log/trivial.hpp> using std::string; ...
- 编译boost.log模块遇到的一些问题
线上日志用到的是日志库,在全局有一个锁,导致在高并发的时候,容易因为锁竞争问题导致时延.在某些情况下,会因为同一个用户,同时访问某个变量,导致读写冲突使线上服务整体core掉(考虑到请求的间隔,为了应 ...
- Boost log中的几个问题
1. 使用动态库时,要定义 BOOST_LOG_DYN_LINK 或者 BOOST_ALL_DYN_LINK 否则会出现如下错误: CMakeFiles/xxxx.dir/xxxx.cpp.o: I ...
- Boost Log 基本使用方法
Boost Log 基本使用方法 flyfish 2014-11-5 依据boost提供的代码演示样例,学习Boost Log 的基本使用方法 前提 boost版本号boost_1_56_0 演示样例 ...
- C++ 日志库 boost::log 以及 glog 的对比
日志能方便地诊断程序原因.统计程序运行数据,是大型软件系统必不可少的组件之一.本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog . 设计 b ...
- C++ boost.python折腾笔记
为了让当年研究生时写的图像处理系统重出江湖起到更大的作用,应研究生导师的意见,对原有的c++框架做了python扩展处理,为了避免遗忘,备注如下: 一.boost 编译 下载boost源码,这里使用b ...
- golang语法要点笔记
golang学习笔记 读<go学习笔记第四版> <学习go语言> <gopl-zh><Go语言实战>记录 多变量赋值时,先计算所有相关值,然后再从左到右 ...
随机推荐
- 【Xamarin挖墙脚系列:Xamarin开发环境配置需求】
原文:[Xamarin挖墙脚系列:Xamarin开发环境配置需求] 前言 因为操作的全是大块头,加大你们的内存,CPU网上飙.... 卤煮的机器配置 最近的版本部署包,百度云离线下载:版本:Xama ...
- BZOJ1345: [Baltic2007]序列问题Sequence
1345: [Baltic2007]序列问题Sequence Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 556 Solved: 274[Submi ...
- Muduo-Base-TimeStamp类
Muduo的时间戳类. 主要功能: 能够获取当前的时间 能够将当前的时间以string的形式返回 能够获取两个时间戳类的时间差 能够获取当前精确的时间(微秒级) #ifndef TIMESTAMP_H ...
- [C# 网络编程系列]专题三:自定义Web服务器
转自:http://www.cnblogs.com/zhili/archive/2012/08/23/2652460.html 前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网 ...
- 前端模块化开发篇之grunt&webpack篇
几个月前写了一篇有关gulp和browserify来做前端构建的博客,因为browserify用来做js的打包时可能有些麻烦(特别是在写React的时候),所以这里再强烈推荐一款js打包工具-webp ...
- 一步一步写一个简单通用的makefile(一)
经常会用写一些小的程序有的是作为测试,但是每次都需要写一些简单的GCC 命令,有的时候移植一些项目中的部分代码到小程序里面进行测试,这个时候GCC 命令并不好些,如果写啦一个比较常用的makefile ...
- 【转】[精华] 跟我一起写 Makefile
陈皓 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,m ...
- Bash For Loop Examples
How do I use bash for loop to repeat certain task under Linux / UNIX operating system? How do I set ...
- 小物件之radio单选列表
有时候在控制器中做了一个数组 然后需要在模板view中循环 同时还需要判断是否有选中的值,就会造成很多开始闭合标签 以前都是这样写 这样实在太繁琐了,不如封装一个小物件 封装函数如下: 代码如下: f ...
- Java实现邮箱找回密码
通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的 ...