ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

01安装配置与基本使用

2022-05-27 16:35:07  阅读:215  来源: 互联网

标签:Category 01 daughter log 配置 sample 安装 appender log4cpp


一、介绍

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

Log4cpp有如下优点:

  • 提供了可扩展的多种日志记录方式;
  • 提供了NDC(嵌套诊断上下文),可用于多线程、多场景的跟踪调试;
  • 提供了完整的日志动态优先级控制,可随时调整需要记录的日志优先级
  • 可通过配置文件完成所有配置并动态加载;
  • 性能优秀,内存占用小,经过编译后的log4cpp.dll大小仅有160kb;
  • 代码级的平台无关性,Log4cpp源代码经过编译后,适用于大多数主流的操作系统和开发工具;
  • 概念清晰,学习和使用方便,熟练程序员一天之内即可很好地应用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有