log4cpp 配置 与 使用

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/ 

转载于:https://my.oschina.net/Cw6PKk/blog/879223

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: log4cpp是一个强大的C++日志库,可以在项目中方便地记录日志。下面是一个使用log4cpp记录日志的实例: 首先,我们需要在项目中添加log4cpp库,并包含对应的头文件。 接下来,我们需要定义一个全局的Logger对象,该对象将负责记录日志信息。可以在一个公共的头文件中定义Logger对象,并在需要记录日志的文件中引用该头文件。 在需要记录日志的地方,我们可以使用Logger对象的不同方法来记录不同级别的日志,例如: logger.error("这是一个错误日志"); //记录错误级别的日志 logger.warn("这是一个警告日志"); //记录警告级别的日志 logger.info("这是一个信息日志"); //记录信息级别的日志 logger.debug("这是一个调试日志"); //记录调试级别的日志 我们也可以在记录日志之前,通过设置Logger对象的不同属性来控制日志输出的格式和级别。例如,可以设置日志输出到指定的文件中,或者将日志输出至控制台。还可以设置日志的格式,如时间戳、日志级别等。这些设置可以通过在初始化Logger对象时传递对应的参数来完成。 当我们的项目运行起来时,日志信息将会按照我们的设置被记录下来。可以根据需要选择查看控制台输出或者日志文件中的日志信息。 总之,log4cpp是一个功能强大的日志记录库,在项目中使用它可以方便地记录不同级别的日志信息,并且可以通过设置不同的属性来满足项目的需求。这样可以方便地监控和调试项目,并且记录的日志信息可以作为项目的重要参考和分析依据。 ### 回答2: log4cpp是一个用于C++的开源日志库,提供了强大的日志记录功能,可以帮助开发人员在项目中方便地进行日志记录和管理。 在项目中使用log4cpp的实例如下: 首先,我们需要在项目中引入log4cpp库,并进行相应的配置。我们可以创建一个名为log4cpp.conf的配置文件,设置日志的输出位置、格式等信息。例如,可以设置日志输出到文件中,同时在控制台打印日志信息。 然后,在代码中,我们可以使用log4cpp来记录日志。首先,需要在代码中包含log4cpp的头文件。然后,我们可以创建一个Logger对象,并指定该日志记录器的名称。例如,可以创建一个名为"mylogger"的Logger对象。 接下来,我们可以使用Logger对象的不同方法来记录不同级别的日志信息。例如,使用logger.error("error message")来记录错误级别的日志信息,使用logger.warn("warning message")来记录警告级别的日志信息。我们还可以通过设置Logger对象的优先级来控制日志记录的级别,从而过滤掉低于某个级别的日志信息。 除了基本的日志记录功能外,log4cpp还提供了其他一些有用的功能,例如:支持多个日志记录器,可以根据需要创建多个Logger对象;支持按照时间、文件大小等条件来进行日志的分割和轮转;支持自定义日志格式等。 总结起来,log4cpp在项目中的使用实例主要包括配置log4cpp库、创建Logger对象、使用Logger对象记录不同级别的日志信息等。它提供了一种方便、灵活和高效的日志记录方式,可以帮助开发人员快速定位和解决问题,提高项目的可维护性和可靠性。 ### 回答3: log4cpp是一个开源的C++日志库,可以用于在项目中记录日志信息。下面是一个使用log4cpp的实例: 假设我们有一个C++项目,需要记录一些重要的操作日志,可以使用log4cpp来实现。 1. 首先,我们需要在项目中引入log4cpp库。可以通过在项目的构建工具中添加log4cpp的依赖项来完成。 2. 在代码中,我们需要包含log4cpp的头文件,并创建一个Logger对象来记录日志。 ```cpp #include <log4cpp/Category.hh> #include <log4cpp/Appender.hh> #include <log4cpp/FileAppender.hh> #include <log4cpp/Layout.hh> #include <log4cpp/PatternLayout.hh> #include <log4cpp/Priority.hh> int main(){ // 创建一个PatternLayout对象,用于设置日志内容的格式 log4cpp::Layout* layout = new log4cpp::PatternLayout(); layout->setConversionPattern("%d [%p] %m%n"); // 创建一个FileAppender对象,用于将日志输出到文件 log4cpp::Appender* appender = new log4cpp::FileAppender("FileAppender", "log.txt"); appender->setLayout(layout); // 创建一个Logger对象,用于记录日志 log4cpp::Category& logger = log4cpp::Category::getInstance("main"); logger.setAppender(appender); logger.setPriority(log4cpp::Priority::DEBUG); // 记录一条日志信息 logger.debug("This is a debug message"); // 清理资源 log4cpp::Category::shutdown(); return 0; } ``` 在上述代码中,我们首先创建了一个PatternLayout对象来设置日志内容的格式,然后创建了一个FileAppender对象来设置将日志输出到一个文件中。接着,我们创建了一个Logger对象,并将之前创建的Appender对象和Layout对象绑定到Logger对象上。最后,我们可以通过调用Logger对象的方法来记录日志信息。 3. 运行程序后,会在项目的根目录下生成一个log.txt文件,其中记录了我们在代码中写入的日志信息。 这就是log4cpp在项目中的一个使用实例。通过log4cpp,我们可以方便地记录和管理项目中的日志信息,便于后续的分析和故障排查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值