01安装配置与基本使用
作者:互联网
一、介绍
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三者的关系如下图所示:
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
输出:
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)效果
四、⽇志级别
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