其他分享
首页 > 其他分享> > 01安装配置与基本使用

01安装配置与基本使用

作者:互联网

一、介绍

Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流、内存字符串队列、文件、回滚文件、调试器、Windows日志、本地syslog和远程syslog服务器中。

Log4cpp有如下优点:

Log4cpp的主页为:http://sourceforge.net/projects/log4cpp/

log4cpp是个基于LGPL的开源项⽬,移植⾃Java的⽇志处理跟踪项⽬log4j,并保持了API上的⼀致。其类
似的⽀持库还包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(log4p)等。

二、安装与编译

这里使用的是log4cpp-1.1.3版本

#!/bin/bash

tar zxf log4cpp-1.1.3.tar.gz

cd log4cpp
./configure   #其实也就是执行了一个shell脚本
make
make check
sudo make install # 头文件安装路径 /usr/local/include/log4cpp   库安放位置 /usr/local/lib/
sudo ldconfig

三、使用细节

3.1 包含的内容对象

Log4cpp中最重要概念有Category(种类)、Appender(附加器)、Layout(布局)、Priorty(优先
级)、NDC(嵌套的诊断上下⽂)

Category、Appender与Layout三者的关系如下图所示:
image

3.2 先举个简单的例子

#include "log4cpp/Category.hh"
#include "log4cpp/FileAppender.hh"
#include "log4cpp/BasicLayout.hh"

int main(int argc, char *argv[])
{
    // 1. 实例化⼀个layout 对象
    log4cpp::Layout *layout = new log4cpp::BasicLayout();
    // 2. 初始化⼀个appender 对象
    log4cpp::Appender *appender = new log4cpp::FileAppender("File Appender", "./01test.log");
    // 3. 把layout对象附着在appender对象上
    appender->setLayout(layout);
    // 4. 实例化⼀个category对象
    log4cpp::Category &warn_log = log4cpp::Category::getInstance("zh_test");
    // 5. 设置additivity为false,替换已有的appender
    warn_log.setAdditivity(false);
    // 5. 把appender对象附到category上
    warn_log.setAppender(appender);
    // 6. 设置category的优先级,低于此优先级的⽇志不被记录
    warn_log.setPriority(log4cpp::Priority::WARN);

    // 记录⼀些⽇志
    warn_log.info("Program info which cannot be wirten");
    warn_log.debug("This debug message will fail to write");
    warn_log.alert("Alert info");

    // 其他记录⽇志⽅式
    warn_log.log(log4cpp::Priority::WARN, "This will be a logged warning");
    
    log4cpp::Priority::PriorityLevel priority;
    bool this_is_critical = true;
    if (this_is_critical)
        priority = log4cpp::Priority::CRIT;
    else
        priority = log4cpp::Priority::DEBUG;
    warn_log.log(priority, "Importance depends on context");

    warn_log.critStream() << "This will show up << as " << 1 << " critical message";
    // clean up and flush all appenders
    log4cpp::Category::shutdown();
    return 0;
}

//编译指令
// g++ -o 01test 01test.cpp -llog4cpp -lpthread

输出:

image

3.3 从配置文件的方式读取日志属性使用

完整使用范例:
(1)配置文件:

#定义 root category 的属性
log4cpp.rootCategory=WARN, console # console是appender对象

#定义 console 属性
log4cpp.appender.console=ConsoleAppender # ConsoleAppender是控制台类型
#log4cpp.appender.console.layout=PatternLayout # PatternLayout是模式样式
#log4cpp.appender.console.layout.ConversionPattern=%d [%p] - %m%n # 格式
log4cpp.appender.console.layout=org.apache.log4cpp.BasicLayout


#定义 sample category 的属性
log4cpp.category.sample=DEBUG, sample # sample是appender对象
#定义 sample appender 的属性
log4cpp.appender.sample=FileAppender # 文件类型
log4cpp.appender.sample.fileName=sample.log # 具体哪个log文件
log4cpp.appender.sample.layout=PatternLayout
log4cpp.appender.sample.layout.ConversionPattern=%d [%p] - %m%n

# 设置sub1.sub2 的additivity属性
log4cpp.additivity.sample.son=true
log4cpp.additivity.sample.daughter=true

#定义 sample.son category 的属性
log4cpp.category.sample.son=DEBUG, son 
#定义 son appender 的属性
log4cpp.appender.son=FileAppender
log4cpp.appender.son.fileName=son.log
log4cpp.appender.son.layout=PatternLayout
log4cpp.appender.son.layout.ConversionPattern=%d [%p] - %m%n

#定义 sample.daughter category 的属性
log4cpp.category.sample.daughter=DEBUG, daughter
#定义 daughter appender 的属性
log4cpp.appender.daughter=FileAppender
log4cpp.appender.daughter.fileName=daughter.log
log4cpp.appender.daughter.layout=PatternLayout
log4cpp.appender.daughter.layout.ConversionPattern=%d [%p] - %m%n

(2)测试程序:

// g++ -o 03test 03test.cpp -llog4cpp -lpthread

#include "log4cpp/Category.hh"
#include "log4cpp/PropertyConfigurator.hh"
#include "log4cpp/NDC.hh"


void test(log4cpp::Category& category)
{
    log4cpp::NDC::push(__FUNCTION__);     // 记录NDC信息
    category.error("zhonghao");
    log4cpp::NDC::pop();
}

int main(int argc, char* argv[])
{
    log4cpp::PropertyConfigurator::configure("./03test_conf.conf");
    log4cpp::Category& root = log4cpp::Category::getRoot();

    log4cpp::Category& sample = log4cpp::Category::getInstance(std::string("sample"));
    log4cpp::Category& sample_son = log4cpp::Category::getInstance(std::string("sample.son"));
    log4cpp::Category& sample_daughter = log4cpp::Category::getInstance(std::string("sample.daughter"));

    log4cpp::NDC::push(__FUNCTION__);     // 记录NDC信息,容器中
    test(root); 

    root.info("root.info()");
    sample.info("sample.info()");
    sample_son.info("sample_son.info()");
    sample_daughter.info("sample_daughter.info()");

    root.error("root.error()");
    sample.error("sample.error()");
    sample_son.error("sample_son.error()");
    sample_daughter.error("sample_daughter.error()");

    //其他输出方式
    sample_daughter.critStream() << "sample_daughter.critStream() << \" \" ";
    sample_daughter << log4cpp::Priority::ERROR << "sample_daughter << log4cpp::Priority::ERROR << \" \";";
    sample_daughter.log(log4cpp::Priority::WARN, "sample_daughter.log(log4cpp::Priority::WARN, \" \");");

    // clean up and flush all appenders
    log4cpp::Category::shutdown();
    return 0;
}

(3)效果
image
image

四、⽇志级别

4.1 log 的优先级

别解读,参阅源码 log4cpp-1.1.3\include\log4cpp\Priority.hh

由⾼到低

EMERG
FATAL
ALERT
CRIT
ERROR
WARN
NOTICE
INFO
DEBUG
NOTSET  

对应到 Category 相应函数,参阅源码 log4cpp-1.1.3\include\log4cpp\Category.hh

Category::emerg()
Category::fatal()
Category::alert()
Category::crit()
Category::error()
Category::warn()
Category::notice()
Category::info()
Category::debug()

以上函数都有 2 个重载函数,可分别接受格式化字串或 std::string,例如 debug(),有

void debug(const char* stringFormat, ...) throw();
void debug(const std::string& message) throw();

4.2 关于优先级别使⽤的建议:

开发运⾏时,设为 DEBUG 级,⽽正式运营时,则设为 NOTICE ;

⼀定要显示出来的信息则可以⽤ NOTICE 或以上级别;

跟踪函数运⾏痕迹的信息⽤ INFO 级别;

运⾏时调试的信息⽤ DEBUG 级别;

标签:Category,01,daughter,log,配置,sample,安装,appender,log4cpp
来源: https://www.cnblogs.com/haozhou286/p/16318106.html