前面几节中描述了Boost.Log 的基础知识,对Boost.Log 库的操作我们都是在C++代码中进行中,这样就会有一些不便的地方。比如说我们想要更改一下输出格式或者过滤条件,都必须对C++代码进行更改,并且还得编译一次(感觉编译时间还有点长)。其实Boost.Log 里面已经为这个问题提供了一种解决方案,就是通过配置文件来初始化Boost.Log 库,C++这边的代码也比较简单,就是这样的:
std::ifstream settings("settings.txt");
if (!settings.is_open())
throw std::runtime_error("Could not open settings.txt file");
logging::init_from_stream(settings);
示例代码:
就这几句代码我们就可以完成对Boost.Log 的简单初始化了,不用自己去写格式化、接收器、过滤条件什么的,非常方便。现在来看看"settings.txt"文件,看看它是怎么让Boost.Log进行初始化的,下面是"settings.txt"文件的内容:
#
# Copyright Andrey Semashev 2007 - 2014.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
#
[Sinks.TextFileSettings]
Destination=TextFile
FileName=test.log
AutoFlush=true
Format="[%TimeStamp%] [%Severity%]\n%MyScopes%\n\t:: %Message%"
Asynchronous=false
Boost.Log库就是通过读取上面那些选项及所对应的数据来进行初始化操作的,下面列出所有默认的可用选项,并解释一下的常用选项的含义:
// Core 配置
Core
// 过滤条件, 例如 "%Severity% >= debug")
Filter
// 禁用日志, true 或者 flase)
DisableLogging
// 接收器配置
Sinks
// 输出位置,有五个选项,每个选项对应一系列相应选项
Destination(Console/TextFile/Syslog/Debugger/SimpleEventLog)
// 控制台对应的选项
##Console
// 是否宽字节 true 或者 flase
Wide
// 自动刷新 true 或者 flase
AutoFlush
// 过滤条件, 例如 "%Severity% >= debug")
Filter
// 异步方式 true 或者 flase
Asynchronous
// 格式化 例如 "[%TimeStamp%] [%Severity%]\n%MyScopes%\n\t:: %Message%"
Format
// 文件对应的选项
##TextFile
// 文件名 可以直接输入文件名也可以输出文件名的格式,例如test.log和"%Y-%m-%d_%N.log"
FileName
// 单个文件大小,超过此大小自动建立新文件 单位是字节
RotationSize
// 多久后自动建立新文件 单位是秒
RotationInterval
// 什么时候自动建立新文件 例如每个0点创建新文件就是:"00:00:00"
RotationTimePoint
AutoFlush
// 是否将记录追加到原有文件 true 或者 flase
Append
// 输出文件夹(有此选项后才能有下列选项)
Target
// 文件夹最大大小 单位是字节
MaxSize
// 文件夹最小预留空间 单位是字节
MinFreeSpace
// 扫描文件 true 或者 flase
ScanForFiles(ALL/Matching)
Filter
Asychronous
Format
##Syslog
LocalAddress
TargetAddress
Filter
Asynchronous
Format
##Debugger
Wide
Filter
Asynchronous
Format
##SimpleEventLog
Wide
LogName
LogSource
Registration
Filter
Asynchronous
Format
[注意]Format的值不支持==、||、&&等运算符,取而代之的是=、or、and和not。
上面的代码Format="[%TimeStamp%] [%Severity%]\n%MyScopes%\n\t:: %Message%", 如果你想在配置文件里面使用%TimeStamp%等属性来格式化记录,那么就必须要在C++里面注册这个属性,并且要在Boost.Log的core里为这个属性注册一个格式工厂。如果你想像Filter="%Severity% >= trace"这样来过滤日志记录,你就得在Boost.Log的core里为这个属性注册一个过滤工厂。如果你想要自己增添选项这也是允许的,你需要在Boost.Log的core里注册一个接收器工厂,然后实现它。具体的方法就不详解了,在上面的源码中可以找到答案。