boost.log(四)记录器

记录器对象

在上个章节的接收器部分我们已经知道了boost.log库是如何存储日志的,现在是时候去尝试记录日志了。首先我们要创建一个记录器,这非常简单:


boost::log::sources::logger lg;

【注意】boost.log库在后台给记录器(logger)提供了写的功能,就如同BOOST_LOG_TRIVIAL 宏一样。

与接收器不同,记录器无须在任何地方注册,因为它们是直接与日志记录核心进行交互的。此外请注意boost.log库提供了两个版本的记录器: 线程安全的(logger_mt)非线程安全的(logger)。对非线程安全记录器来说,通过不同的记录器的实例在不同的线程上来写日志它是安全的,因此每个线程应该有一个单独的日志记录器。同时,线程安全的记录器可以在不同的线程间写日志,但是在抢夺线程的时候会导致速度下降。

全局记录器对象

如果你不想把一个记录器(logger)放置到你的类里面,boost.log库提供了一个宏来创建一个全局的记录器(logger):


BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger, boost::log::sources::logger_mt);

这里my_logger是一个用户自定义的名称,稍后将用于检索记录器(logger)实例和logger_mt对应的记录器(logger)类型。用户可以给boost.log库提供任何记录器(logger)类型的声明。然而,由于该记录器(logger)将会只有一个实例,你通常希望使用一个线程安全的全局记录器(logger)在多线程程序中工作。

接下来你就可以这样获取记录器(logger):


boost::log::sources::logger_mt& lg = my_logger::get();

lg将获取应用程序中记录器(logger)的唯一实例,而get()函数是线程安全的,无需额外的安全保护。

写入日志

不管你使用什么样的记录器(logger)(类成员或全局,线程安全与否),写一个记录到日志你都可以这样做:


#include <boost/log/sources/logger.hpp>

#include <boost/log/sources/record_ostream.hpp>

#include <boost/log//sources/global_logger_storage.hpp>

 

BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger, boost::log::sources::logger_mt);

 

int main()

{

	boost::log::sources::logger_mt& lg = my_logger::get();

 

	boost::log::record rec = lg.open_record();

	if (rec)

	{

		boost::log::record_ostream strm(rec);

		strm << "Hello, World!";

		strm.flush();

		lg.push_record(boost::move(rec));

	}

 

	return 0;

}

这里的 open_record 函数的调用来确定是否有至少一个接收器来消费这条记录。日志记录的过滤就是在这一阶段进行的。如果记录被消耗,函数将返回一个有效的记录对象(record object),和一个可以填写记录消息的字符串。在那之后再调用push_record函数就可以完成记录处理了,结果如下:

当然上面的语法可以用一个宏来替换,boost.log库鼓励大家用宏而不是直接C++层面提供的接口,上面的日志可以这样写:


#include <boost/log/sources/logger.hpp>

#include <boost/log/sources/record_ostream.hpp>

#include <boost/log//sources/global_logger_storage.hpp>

 

BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(my_logger, boost::log::sources::logger_mt);

 

int main()

{

	boost::log::sources::logger_mt& lg = my_logger::get();

 

	boost::log::record rec = lg.open_record();

	if (rec)

	{

		BOOST_LOG(lg) << "Hello, World!";

	}

 

	return 0;

}
时间: 2025-01-09 20:47:56

boost.log(四)记录器的相关文章

Boost Log 基本用法

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) 流向哪里        (co

boost.log(八)宽字符记录

宽字符记录 Boost.Log支持包含本地字符集字符串的日志记录.基本上有两种方式做这件事.在 UNIX 系统上通常使用一些多字节字符编码 (例如 UTF-8) 用来表示本地字符.在这种情况下,Boost.Log库可以直接以纯 ASCII 的方式记录而不需要其它额外的设置. 在Windows 上常见的做法是使用宽字符串来表示本地字符串.此外大多数系统 API 也是使用的宽字符,这需要特定于 Windows 的接收器也支持宽字符.另一方面,通用的接收器,例如 TextFile,是面向字节的,你写入

boost.log(六)格式化

如果你尝试运行上一节中的例子,你会发现只有日志记录消息(没有时间戳等属性信息)会被写入到文件.这是因为boost.log库没有设置格式化.即使你添加了属性到boost.log的core或者是记录器中,记录值也不会被输出,除非你指定了这些值的格式. 回到在前面节教程的一个例子: #include <iostream> #include <boost/log/utility/setup/file.hpp> #include <boost/log/sinks/basic_sink_

boost.log(五)属性

在前面几节中我们提到属性和属性值好几次.在这节我们会学习如何使用属性,以添加更多的数据到日志记录. 每条日志记录可以附加多个已命名的属性值,属性可以代表日志记录产生时任何与程序运行相关的数据信息.如代码位置.执行模块名称.当前数据和时间以及程序运行相关的任何数据信息.属性可以表现为一个值生成器,在这种情况下,将用于返回它参与的每个不同日志记录所生成的值.一旦属性生成值,就可以把这个值用于过滤器,格式化器和接收器.但是使用该属性值你必须知道它的名称和类型.boost.log库中实现了常用的属性,你

boost.log(二)过滤

日志过滤 严重级别可以使日志信息更加翔实,但通常也会成为筛选器用来过滤日志记录的工具.在Log库的core里面可以通过设置全局过滤器很容易地做到日志过滤,就像下面一样: #include <iostream> #include <boost/log/core.hpp> #include <boost/log/trivial.hpp> #include <boost/log/expressions.hpp> void init() { boost::log::

boost.log要点笔记

常用简写: 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; 要点: 结构图要牢记在

boost.log在项目中应用

#pragma once #include <string> #include <boost/log/trivial.hpp> using std::string; #define LOG_DEBUG\ BOOST_LOG_SEV((MyLog::s_slg),(boost::log::trivial::debug)) #define LOG_INFO\ BOOST_LOG_SEV((MyLog::s_slg),(boost::log::trivial::info)) #defin

boost.log 的使用

在编译boost.log 的示例程序时,遇到了下面的错误: zhifan$ make boost_log LDFLAGS='-lboost_log-mt' Undefined symbols for architecture x86_64: "boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*)", re

Boost log 简单使用

Boost log 简单使用 flyfish 2014-11-8 该示例是在VC2010 MFC Unicode环境下使用 内容包括 1 启动关闭日志 2 设置日志存储路径 3 设置输出日志等级 4 日志是否立即写入文件 5 设置单个文件的大小 6 设置磁盘最小可利用空间 Logger.h #pragma once #include <cassert> #include <iostream> #include <fstream> #include <boost/l