文档章节

log4cpp 配置 与 使用

S
 ShuyangZ
发布于 2017/04/13 21:26
字数 1261
阅读 98
收藏 0

1. 基本概念 

  • categories 日志的层级体系
  • appenders 日志打印到什么地方,可以是文件,也可以是终端
  • layouts 日志输出格式,定义类似于printf中的输出方式。有三种,后面都有例子,这三种分别是:basic,simple,pattern
  • priority  日志的级别,所有的级别有:EMERG、FATAL、ALERT、CRIT、ERROR、WARN、NOTICE、INFO、DEBUG、NOTSET,其中NOTSET < DEBUG < INFO < NOTICE < WARN < ERROR < CRIT < ALERT < FATAL = EMERG。这个优先级的含义是:配置文件中设置了级别是debug,则任意的log都能打出来;如果配置了级别是fatal,则只有高于他优先级的日志才可以打印出来
  • additivity 限制appender会不会被继承(后面还有补充说明)

2. 程序举例

#include <stdio.h>
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/SimpleLayout.hh>

#define LOGFILE "./test.log"

int main() {
    /*Setting up Appender, layout and Category*/
    log4cpp::Appender *appender = new log4cpp::FileAppender("FileAppender",LOGFILE);//第一个参数是appender的名字,第二个是log文件的名字
    log4cpp::Layout *layout = new log4cpp::SimpleLayout();
    //log4cpp::Layout *layout = new log4cpp::BasicLayout();
    log4cpp::Category& category = log4cpp::Category::getInstance("abc");

    appender->setLayout(layout);
    category.setAppender(appender);
    category.setPriority(log4cpp::Priority::INFO);

    /*The actual logging*/
    category.info("This is for tracing the flow");
    category.notice("This is to notify certain events");
    category.warn("This is to generate certain warnings");

以上程序将得到下面的log输出:

INFO    : This is for tracing the flow
NOTICE  : This is to notify certain events 

WARN    : This is to generate certain warnings 

这个程序里面可以把 log4cpp::Layout *layout = new log4cpp::BasicLayout(); 的注释取消,注释掉上面的语句。将得到下面的log输出:

1308806376 INFO abc : This is for tracing the flow

1308806376 NOTICE abc : This is to notify certain events

1308806376 WARN abc : This is to generate certain warnings 

两者的区别就在于使用了不同的layout,一个是simple一个是basic的。

要做到复杂格式的输出就要使用第三种,即:PatternLayout,下面借助配置文件来说明这种方式的使用:

3. 配置文件说明

配置文件log4cpp.conf: 

# 定义了3个category sub1, sub2, sub3
# 其中sub2和sub3设置了additivity属性为false;sub1的additivity属性默认为true
rootCategory=DEBUG, rootAppender

category.sub1=,A1

category.sub2=INFO, A2
additivity.sub2=false

category.sub3=ERROR, A3
additivity.sub3=false


# 定义rootAppender类型和layout属性,这里使用了BasicLayout
appender.rootAppender=org.apache.log4cpp.ConsoleAppender
appender.rootAppender.layout=org.apache.log4cpp.BasicLayout

#定义A1的属性,这里使用了SimpleLayout
appender.A1=org.apache.log4cpp.FileAppender
appender.A1.fileName=./log/A1.log
appender.A1.layout=org.apache.log4cpp.SimpleLayout

#定义A2的属性,这里使用了PatternLayout
appender.A2=org.apache.log4cpp.ConsoleAppender
appender.A2.layout=org.apache.log4cpp.PatternLayout
appender.A2.layout.ConversionPattern=The message '%m' at time %d%n

#定义A3的属性
appender.A3=org.apache.log4cpp.RollingFileAppender
appender.A3.fileName=./log/A3.log
appender.A3.maxFileSize=50
appender.A3.maxBackupIndex=3
appender.A3.backupPattern=%Y-%m-%d
appender.A3.layout=org.apache.log4cpp.PatternLayout
appender.A3.layout.ConversionPattern=%d{%Y-%m-%d %H:%M:%S} [%p]: [%c] %m%n

4. 带配置文件的程序举例 

源代码: 

#include "log4cpp/Category.hh"
#include "log4cpp/PropertyConfigurator.hh"
int main(int argc, char* argv[]) {
    // 1 读取解析配置文件
    // 读取出错, 完全可以忽略,可以定义一个缺省策略或者使用系统缺省策略
    // BasicLayout输出所有优先级日志到ConsoleAppender
    try
    {
        log4cpp::PropertyConfigurator::configure("./log4cpp.conf");
    }
    catch (log4cpp::ConfigureFailure& f)
    {
        std::cout << "Configure Problem " << f.what() << std::endl;
        return -1;
    }

    //2    实例化category对象
    //    这些对象即使配置文件没有定义也可以使用,不过其属性继承其父category
    //    通常使用引用可能不太方便,可以使用指针,以后做指针使用
    log4cpp::Category& root = log4cpp::Category::getRoot();
    log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));
    log4cpp::Category& sub2 = log4cpp::Category::getInstance(std::string("sub2"));
    log4cpp::Category& sub3 = log4cpp::Category::getInstance(std::string("sub3"));
    log4cpp::Category& sub4 = log4cpp::Category::getInstance(std::string("sub4"));

    //    正常使用这些category对象进行日志处理。
    root.fatal("root's log");

    //    sub1 has appender A1 and rootappender. since the additivity property is set true by default
    sub1.info("sub1's log");

    //    sub2 has appender A2 appender. since the additivity property is set to false
    sub2.alert("sub2's log");

    //    sub3 only has A3 appender. since the additivity property is set to false
    sub3.debug("sub3's log");
    sub3.alert("sub3's log");

    //    sub4 can not be found in the config file, so the root category's appender and layout are used
    sub4.warn("sub4's log");

    return 0;
}

终端打印出来的log: 

1308828470 FATAL  : root's log

1308828470 INFO sub1 : sub1's log

The message 'sub2's log' at time 2011-06-23 19:27:50,624 

1308829427 WARN sub4 : sub4's log  

log/A1.log的内容:

INFO    : sub1's log

log/A3.log的内容:

2011-06-23 19:27:50 [ALERT]: [sub3] sub3's log 

5. 配置参考 

Appender Additivity

The output of a log statement of logger C will go to all the appenders in C and its ancestors. This is the meaning of the term "appender additivity".

However, if an ancestor of logger C, say P, has the additivity flag set to false, then C's output will be directed to all the appenders in C and its ancestors upto and including P but not the appenders in any of the ancestors of P.

 

Loggers have their additivity flag set to true by default. 

参考来自:http://logging.apache.org/log4j/1.2/manual.html 

 

 

Sets the format of log lines handled by this PatternLayout.

By default, set to "%m%n".
Format characters are as follows:

  • %%%% - a single percent sign
  • %c - the category
  • %d - the date
    Date format: The date format character may be followed by a date format specifier enclosed between braces. For example, %d{%H:%M:%S,%l} or %d{%d %m %Y %H:%M:%S,%l}. If no date format specifier is given then the following format is used: "Wed Jan 02 02:03:55 1980". The date format specifier admits the same syntax as the ANSI C function strftime, with 1 addition. The addition is the specifier %l for milliseconds, padded with zeros to make 3 digits.
  • %m - the message
  • %n - the platform specific line separator
  • %p - the priority
  • %r - milliseconds since this layout was created.
  • %R - seconds since Jan 1, 1970
  • %u - clock ticks since process start
  • %x - the NDC

 

 

参考来自:http://log4cpp.sourceforge.net/api/classlog4cpp_1_1PatternLayout.html

 

这也是一篇不错的参考文章: 

http://joysofprogramming.com/log4cpp-tutorial/ 

本文转载自:http://www.cnblogs.com/welkinwalker/archive/2011/06/23/2088197.html

S
粉丝 3
博文 26
码字总数 2841
作品 0
苏州
私信 提问
xcode 添加文件头搜索路径

比如 #include log4cpp 在 /usr/local/Cellar/log4cpp/1.1.1/include/log4cpp xcode怎么配置 我项目里面 头文件都在 include目录下面 我的CPP文件里面都是写的#include "xxx.h" 使用-Iinclu......

zs123123
2017/04/27
130
0
liudegui/log4cplus

#log4cplus 基于log4cplus修改 修改内容: 只支持Windows和Linux平台,去掉其他平台的支持(vs2010和gcc4.4测试通过)。 去除unicode的支持 只保留consoleAppender、fileAppender;并添加cus...

liudegui
2014/08/18
0
0
大神们,请问如何log4cpp将不同位置的日志信息输出到同一个.log文件中?

大神们,请问如何log4cpp将不同位置的日志信息输出到同一个.log文件中?我现在的日志输出全部显示在同一个cpp文件中,但日志信息来源明明是不同的不同位置的不同cpp文件。

小鱼snoopy
2018/09/26
40
0
大神们,请问如何log4cpp将不同位置的日志信息输出到同一个.log文件中?

大神们,请问如何log4cpp将不同位置的日志信息输出到同一个.log文件中?我现在的日志输出全部显示在同一个cpp文件中,但日志信息来源明明是不同的不同位置的不同cpp文件。

小鱼snoopy
2018/09/25
26
0
大神们,请问如何log4cpp将不同位置的日志信息输出到同一个.log文件中?

大神们,请问如何log4cpp将不同位置的日志信息输出到同一个.log文件中?我现在的日志输出全部显示在同一个cpp文件中,但日志信息来源明明是不同的不同位置的不同cpp文件。

小鱼snoopy
2018/09/19
569
0

没有更多内容

加载失败,请刷新页面

加载更多

0.01-Win10安装linux子系统

一、安装Debian子系统 -1、控制面板设置: -1.1、打开“控制面板” —— “程序” —— “启用或关闭Windows功能” —— 勾选 “适用于Linux的Windows子系统” -2、设置: -2.1、打开“设置”...

静以修身2025
昨天
2
0
init 0-6 (启动级别:init 0,1,2,3,4,5,6)

启动级别: init 0,1,2,3,4,5,6 这是个很久的知识点了,只是自己一直都迷迷糊糊的,今天在翻出来好好理解下。。 0: 停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system...

圣洁之子
昨天
2
0
Android Camera HAL浅析

1、Camera成像原理介绍 Camera工作流程图 Camera的成像原理可以简单概括如下: 景物(SCENE)通过镜头(LENS)生成的光学图像投射到图像传感器(Sensor)表面上,然后转为电信号,经过A/D(模数转...

天王盖地虎626
昨天
2
0
聊聊Elasticsearch的ProcessProbe

序 本文主要研究一下Elasticsearch的ProcessProbe ProcessProbe elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/process/ProcessProbe.java public class ProcessProb......

go4it
昨天
3
0
mysql PL(procedure language)流程控制语句

在MySQL中,常见的过程式SQL语句可以用在存储体中。其中包括IF语句、CASE语句、LOOP语句、WHILE语句、ITERATE语句和LEAVE语句,它们可以进行流程控制。 IF语句相当于Java中的if()...else if(...

edison_kwok
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部