日志库EasyLogging++学习系列(4)—— 格式说明符

101 篇文章 2 订阅

在上一篇文章中,主要记录了如何使用 Easylogging++ 的配置功能,虽然已经用了很大的篇幅尽可能详细地加以记录,不过相信有些细心的小伙伴可能已经发现遗漏了些什么,请看下面两句摘自 my_log.conf 配置文件的语句:

  1. FORMAT          =   "[%level | %datetime] | %msg"    
  2. FILENAME        =   "log\\log_%datetime{%Y%M%d}.log"   
FORMAT          =   "[%level | %datetime] | %msg"  
FILENAME        =   "log\\log_%datetime{%Y%M%d}.log" 

对于等号右边的值,比如 %level、%datetime{%Y%M%d} 这些特殊符号的意义和用法在上一文中并没有提及,所以就在这里对此进行一个补充说明。而这些特殊的符号,就是 Easylogging++ 用于控制日志输出的格式说明符。



输出格式说明符


C语言的格式化输出一样,Easylogging++ 也可以格式化输出日志,下面的表格列举了GitHub上给出的 Easylogging++ 支持的输出格式说明符:


SpecifierReplaced By
%loggerLogger ID
%threadThread ID - Uses std::thread if available, otherwise GetCurrentThreadId() on windows
%levelSeverity level (Info, Debug, Error, Warning, Fatal, Verbose, Trace)
%levshortSeverity level (Short version i.e, I for Info and respectively D, E, W, F, V, T)
%vlevelVerbosity level (Applicable to verbose logging)
%datetimeDate and/or time - Pattern is customizable - see Date/Time Format Specifiers below
%userUser currently running application
%hostComputer name application is running on
%fileFile name of source file (Full path)
%fbaseFile name of source file (Only base name)
%lineSource line number
%funcLogging function
%locSource filename and line number of logging (separated by colon)
%msgActual log message
%Escape character (e.g, %%level will write %level)

另外,Easylogging++ 还提供了让我们自定义格式说明符的能力。下面的代码演示了如何自定义 %ip_addr 这个格式说明符:

  1. #include "easylogging++.h"  
  2.   
  3. INITIALIZE_EASYLOGGINGPP  
  4.   
  5. const char* getIp(void)   
  6. {  
  7.     return "192.168.1.1";  
  8. }  
  9.   
  10. int main(void)   
  11. {  
  12.     /// 自定义格式说明符 %ip_addr  
  13.     el::Helpers::installCustomFormatSpecifier(el::CustomFormatSpecifier("%ip_addr", getIp));  
  14.   
  15.     /// 利用自定义格式说明符 %ip_addr 进行日志输出  
  16.     el::Loggers::reconfigureAllLoggers(el::ConfigurationType::Format, "%datetime %level %ip_addr : %msg");  
  17.     LOG(INFO) << "This is request from client";  
  18.   
  19.     system("pause");  
  20.     return 0;  
  21. }  
#include "easylogging++.h"

INITIALIZE_EASYLOGGINGPP

const char* getIp(void) 
{
	return "192.168.1.1";
}

int main(void) 
{
	/// 自定义格式说明符 %ip_addr
	el::Helpers::installCustomFormatSpecifier(el::CustomFormatSpecifier("%ip_addr", getIp));

	/// 利用自定义格式说明符 %ip_addr 进行日志输出
	el::Loggers::reconfigureAllLoggers(el::ConfigurationType::Format, "%datetime %level %ip_addr : %msg");
	LOG(INFO) << "This is request from client";

	system("pause");
	return 0;
}

时间格式说明符


在输出格式说明符中有一个专门用于格式化输出时间的说明符:%datetime ,而 Easylogging++  已经默认为 %datetime 设置了一个时间输出格式。然而,我们可以利用时间格式说明符重新自定义时间的输出格式,下面的表格列举了GitHub上给出的 Easylogging++  支持的时间格式说明符:


SpecifierReplaced By
%dDay of month (zero-padded)
%aDay of the week - short (Mon, Tue, Wed, Thu, Fri, Sat, Sun)
%ADay of the week - long (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
%MMonth (zero-padded)
%bMonth - short (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
%BMonth - Long (January, February, March, April, May, June, July, August, September, October, November, December)
%yYear - Two digit (13, 14 etc)
%YYear - Four digit (2013, 2014 etc)
%hHour (12-hour format)
%HHour (24-hour format)
%mMinute (zero-padded)
%sSecond (zero-padded)
%gMilliseconds (width is configured by ConfigurationType::MillisecondsWidth)
%FAM/PM designation
%Escape character
需要注意的是,在 Easylogging++ 中,时间的输出格式最大仅支持 30 个字符。



注意事项


在刚开始使用 Easylogging++ 作为我的日志库的时候,我曾经写过下面这样一个配置文件:

  1. * GLOBAL:  
  2.     FORMAT                  =   "[%level | %datetime] | %msg"  
  3.     ENABLED                 =   true  
  4.     TO_FILE                 =   true  
  5.     TO_STANDARD_OUTPUT      =   true  
  6.     MILLISECONDS_WIDTH      =   3  
  7.     PERFORMANCE_TRACKING    =   false  
  8.     MAX_LOG_FILE_SIZE       =   2097152 ##   
  9.     LOG_FLUSH_THRESHOLD     =   0  
  10. * INFO:  
  11.     FILENAME                =   "log\\server_%level_%datetime{%Y%M%d%H}.log"  
  12. * DEBUG:  
  13.     ENABLED                 =   false  
  14. * WARNING:  
  15.     FILENAME                =   "log\\server_%level_%datetime{%Y%M%d%H}.log"  
  16. * TRACE:  
  17.     FILENAME                =   "log\\server_%level_%datetime{%Y%M%d%H}.log"  
  18. * VERBOSE:  
  19.     ENABLED                 =   false  
  20. * ERROR:  
  21.     FILENAME                =   "log\\server_%level_%datetime{%Y%M%d%H}.log"  
  22. * FATAL:  
  23.     ENABLED                 =   false  
* GLOBAL:
    FORMAT                  =   "[%level | %datetime] | %msg"
    ENABLED                 =   true
    TO_FILE                 =   true
    TO_STANDARD_OUTPUT      =   true
    MILLISECONDS_WIDTH      =   3
    PERFORMANCE_TRACKING    =   false
    MAX_LOG_FILE_SIZE       =   2097152 ## 
	LOG_FLUSH_THRESHOLD     =   0
* INFO:
    FILENAME                =   "log\\server_%level_%datetime{%Y%M%d%H}.log"
* DEBUG:
    ENABLED                 =   false
* WARNING:
    FILENAME                =   "log\\server_%level_%datetime{%Y%M%d%H}.log"
* TRACE:
    FILENAME                =   "log\\server_%level_%datetime{%Y%M%d%H}.log"
* VERBOSE:
    ENABLED                 =   false
* ERROR:
    FILENAME                =   "log\\server_%level_%datetime{%Y%M%d%H}.log"
* FATAL:
    ENABLED                 =   false
配置文件的意思很简单,就是我想让不同级别的日志保存在不同的文件中而已,但是事实上,如果使用上面的这个配置文件,那么在 log 日志文件夹下就只会生成一个名称为 server_%level_2015102715.log 的日志文件,并且所有级别的日志都只会保存在这个日志文件中。


从上面给出的反例中可以看出,对于输出格式说明符,只适用于配置项 FORMAT;而时间格式说明符,不仅适用于配置项 FORMAT,同样还适用于配置项 FILENAME。这一点,通过查看 Easylogging++ 的源码也可以得到证实。当然,如果我们想要让配置项 FILENAME 也能够使用输出格式说明符,可以通过修改源码去实现。建议有兴趣的小伙伴参考一下函数 updateFormatSpec() ,然后在函数 resolveFilename() 中修改即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值