log4cpp 使用完全手册「建议收藏」

log4cpp 使用完全手册「建议收藏」原文链接 点击打开链接一、log4cpp概述     Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下:提供应用程序运行上下文,方便跟踪调试;可扩展的、多种方式记录日志,包括命令行、文件、回卷文件、内存、syslog服务器、Win事件日志等;可以动态控制日志记录级别,在效率和功能中进行调整;所有配置可以通过配置文件进行动态调整;多语言支持,包括Ja…

大家好,又见面了,我是你们的朋友全栈君。

原文链接 点击打开链接

一、log4cpp概述

      Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下:

    • 提供应用程序运行上下文,方便跟踪调试;
    • 可扩展的、多种方式记录日志,包括命令行、文件、回卷文件、内存、syslog服务器、Win事件日志等;
    • 可以动态控制日志记录级别,在效率和功能中进行调整;
    • 所有配置可以通过配置文件进行动态调整;
    • 多语言支持,包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(log4p)等;

二、原理

      Log4cpp有三个主要的组件:日志类别(Category)、输出源(Appender)和布局(Layout)。这三种类型的组件一起工作使得系统可以根据信息的类型和级别记录它们,并且在运行时控制这些信息的输出格式和位置。

三个组件的介绍:

1)日志类别(Category)含义是:如果配置文件中设置的级别是DEBUG,则任意的log都能打印出来;但如果配置的级别是ERROR,则只有高于ERROR优先级的日志才可以打印出来。

日志的常用优先级:DEBUG < INFO < WARN < ERROR < FATAL

2)输出源(Appender)用来输出日志(被layout格式化后)到一些设备上,比如文件、命令行、内存等。也可以定义自己的appender输出日志信息到别的设备上。log4cpp提供的appender如下: FileAppender  输出到文件 RollingFileAppender 输出到回卷文件,即当文件到达某个大小后回卷 ConsoleAppender 输出到控制台

3)布局(Layout):显示样式PatternLayout表示让用户根据类似于C语言printf函数的转换模式来指定输出格式

三个组件之间的关系:

  • Category和Appender的关系是:多个Appender可以附加到一个Category上,这样一个日志消息可以同时输出到多个设备上。
  • Appender和Layout的关系是:Layout附加在Appender上,appender调用layout处理完日志消息后,记录到某个设备上。

三、配置文件log4cpp.conf

内容如下:

复制代码
 1 #-------定义rootCategory的属性-------
 2 
 3 #指定rootCategory的log优先级是ERROR,其Appenders有两个,分别是console,TESTAppender
 4 log4cpp.rootCategory=ERROR, console,TESTAppender
 5 
 6 #-------定义console属性-------
 7 
 8 #consoleAppender类型:控制台输出
 9 #下面这三条语句表示控制台输出的log输出的布局按照指定的格式;输出格式是:[%p] %d{%H:%M:%S.%l} (%c): %m%n
10 log4cpp.appender.console=ConsoleAppender
11 log4cpp.appender.console.layout=PatternLayout
12 log4cpp.appender.console.layout.ConversionPattern=[%p] %d{%H:%M:%S.%l} (%c): %m%n
13 
14 #-------定义TESTAppender的属性-------
15 
16 #RollingFileAppender类型:输出到回卷文件,即文件到达某个大小的时候产生一个新的文件
17 #下面的语句表示文件输出到指定的log文件,输出的布局按照指定的格式,输出的格式是:[%d{%Y-%m-%d %H:%M:%S.%l} - %p] (%c): %m%n
18 log4cpp.appender.TESTAppender=RollingFileAppender
19 
20 #当日志文件到达maxFileSize大小时,将会自动滚动
21 log4cpp.appender.TESTAppender.maxFileSize=400000
22 
23 #maxBackupIndex指定可以产生的滚动文件的最大数
24 log4cpp.appender.TESTAppender.maxBackupIndex=3
25 
26 #fileName指定信息输出到logs/TESTAppender.txt文件
27 log4cpp.appender.TESTAppender.fileName=logs/TESTAppender.txt
28 
29 #PatternLayout 表示可以灵活指定布局模式
30 log4cpp.appender.TESTAppender.layout=PatternLayout
31 
32 #append=true 信息追加到上面指定的日志文件中,false表示将信息覆盖指定文件内容
33 log4cpp.appender.TESTAppender.append=true
34 log4cpp.appender.TESTAppender.layout.ConversionPattern=[%d{%Y-%m-%d %H:%M:%S.%l} - %p] (%c): %m%n 
复制代码

ConversionPattern的参数含义:

  • %d 输出日志时间点的日期或时间,可以在其后指定格式,如上%d{%Y-%m-%d %H:%M:%S.%l},输出类似:2017-02-14 09:25:00.953
  • %p 优先级,即DEBUG,INFO,WARN,ERROR,FATAL
  • %c 输出日志信息所属的类目,通常就是所在类的全名
  • %m 输出log的具体信息
  • %n 回车换行

四、实际应用

     在问题定位的过程中,有时由于设置的日志级别较高,打印出来的信息不够全面,因此需要通过修改配置文件来动态调整日志级别,即修改属性值log4cpp.rootCategory=ERROR 为 log4cpp.rootCategory=DEBUG 这样就可以看到最新的DEBUG级别以上的日志信息了。

补充:

如何改变layout格式呢?

首先回顾一下HelloWorld的日志格式,它使用了最简单的BasicLayout:

1248337987 ERROR  : Hello log4cpp in a Error Message!
1248337987 WARN : Hello log4cpp in a Warning Message!

  上面的日志格式还可以,但显然不是许多程序员心中理想的格式,许多人理想的格式应该是这样的:

20090724 15:59:55,703: INFO infoCategory : system is running
20090724 15:59:55,703: WARN infoCategory : system has a warning
20090724 15:59:55,703: ERROR infoCategory : system has a error, cant find a file
20090724 15:59:55,718: FATAL infoCategory : system has a fatal error, must be shutdown
20090724 15:59:55,718: INFO infoCategory : system shutdown, you can find some information in system log

   要获得上面的格式,必须使用比BasicLayout复杂的PatternLayout,而且要花一个小时来熟悉一下PatternLayout的格式定义方式,如果你认为值得的话。

PatternLayout

  在介绍PatternLayout以前,首先来看看log4cpp中所有的Layout子类(Layout本身是个虚类),一共三个:BasicLayout、PatternLayout和SimpleLayout,其中SimapleLayout并不建议使用,而BaiscLayout过于简单,因此如果程序员不自己扩展Layout的话,就只能使用PatternLayout了,值得庆幸的是,PatternLayout还是比较好用的。

PatternLayout使用setConversionPattern函数来设置日志的输出格式。该函数的声明如下:

void log4cpp::PatternLayout::setConversionPattern  (  const std::string &  conversionPattern   )  throw (ConfigureFailure) [virtual]

其中参数类型为std::string,类似于C语言中的printf,使用格式化字符串来描述输出格式,其具体含义如下:

 %c category;
%d 日期;日期可以进一步的设置格式,用花括号包围,例如%d{%H:%M:%S,%l} 或者 %d{%d %m %Y %H:%M:%S,%l}。如果不设置具体日期格式,则如下默认格式被使用“Wed Jan 02 02:03:55 1980”。日期的格式符号与ANSI C函数strftime中的一致。但增加了一个格式符号%l,表示毫秒,占三个十进制位。
%m 消息;
%n 换行符,会根据平台的不同而不同,但对于用户透明;
%p 优先级;
%r 自从layout被创建后的毫秒数;
%R 从1970年1月1日0时开始到目前为止的秒数;
%u 进程开始到目前为止的时钟周期数;
%x NDC。

   因此,要得到上述的理想格式,可以将setConversionPattern的参数设置为“%d: %p %c %x: %m%n”,其具体含义是“时间: 优先级 Category NDC: 消息 换行”。使用PatternLayout的例子程序如下,项目名称是LayoutExam:

#include <iostream>
#include 
<log4cpp/Category.hh>
#include 
<log4cpp/OstreamAppender.hh>
#include 
<log4cpp/Priority.hh>
#include 
<log4cpp/PatternLayout.hh>
using namespace std;

int main(int argc, char* argv[])
{

   log4cpp::OstreamAppender
* osAppender = new log4cpp::OstreamAppender(osAppender&cout);
    
    log4cpp::PatternLayout
* pLayout = new log4cpp::PatternLayout();
    pLayout
->setConversionPattern(%d: %p %c %x: %m%n);
    osAppender
->setLayout(pLayout);
        
    log4cpp::Category
& root = log4cpp::Category::getRoot();
    log4cpp::Category
& infoCategory = root.getInstance(infoCategory);
    infoCategory.addAppender(osAppender);
    infoCategory.setPriority(log4cpp::Priority::INFO);

    infoCategory.info(system is running);
    infoCategory.warn(
system has a warning);
    infoCategory.error(
system has a error, can’t find a file);
    infoCategory.fatal(
system has a fatal error,must be shutdown);
    infoCategory.info(
system shutdown,you can find some information in system log);

    log4cpp::Category::shutdown();
    
    return 0;
}

其运行结果即如下所示:

2009-07-24 15:59:55,703: INFO infoCategory : system is running
2009-07-24 15:59:55,703: WARN infoCategory : system has a warning
2009-07-24 15:59:55,703: ERROR infoCategory : system has a error, can’t find a file
2009-07-24 15:59:55,718: FATAL infoCategory : system has a fatal error, must be shutdown
2009-07-24 15:59:55,718: INFO infoCategory : system shutdown, you can find some information in system log

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158390.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • BeanUtils.populate()的作用

    BeanUtils.populate()的作用//1.获得请求参数Map<String,String[]>map=request.getParameterMap();Useruser=newUser();//

  • eclipse自动补全左边代码_eclipse自动补全返回类型

    eclipse自动补全左边代码_eclipse自动补全返回类型win平台下是:CTRL+1回车MAC下是:command+1回车

    2022年10月13日
  • 用sql创建索引_sqlserver索引的建立与使用

    用sql创建索引_sqlserver索引的建立与使用index_mode自定义索引名cn_name表名car_mode列名1.创建普通索引SQLCREATEINDEX语法在表上创建一个简单的索引。允许使用重复的值:注释:“column_name”规定需要索引的列。2.创建唯一索引SQLCREATEUNIQUEINDEX语法在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。3.实例CREATEINDEX实例本例会创建一个简单的索引,名为“PersonIndex”,在Person表的Las

  • 使用es6模板字符串嵌入变量,并实现循环「建议收藏」

    使用es6模板字符串嵌入变量,并实现循环「建议收藏」模板字符串支持嵌入变量,只需要将变量名写在${}之中。在模板字符串中,遍历数组,生成循环结构。letarr=[‘aaa’,’bbbb’,’c’,’dd’,’f’]lettemp=`<ul>${arr.map(item=>{return`<li>${item}</li>`}).join(”)}</ul>`console.log(temp);/*<ul><li>aa

  • redis默认端口为什么是6379_redis 端口

    redis默认端口为什么是6379_redis 端口1、如果开了redis服务,先将服务关闭2、在window上找到redis的安装目录,修改redis.windows.conf文件,在里面将默认端口改为你想要的端口号3、将redis.windows.conf文件直接拖入redis-server.exe,弹出窗口

  • pycharm社区版使用教程_chrome简体中文

    pycharm社区版使用教程_chrome简体中文PyCharm的默认界面是英文的,安装PyCharm中文界面插件是最简单的汉化方式:①点击“File”,②出现的菜单中点击“Settings”,③在弹出的界面中,选“Plugins”,然后在右边输入框中输入“chinese”,④在搜索结果中,选中第一个结果,点击右边的“install”即可。…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号