log4cpp有3个主要的组件:categories(类别)、appenders(附加目的地)、和 layouts(布局),layout类控制输出日志消息的显示样式。
github源码地址:
https://github.com/klc407073648/my_dev_code/tree/master/log4cppTest/demo
其中包含三个目录:
1.OsAppenderUse,输出到控制平台的demo
2.fileAppenderUse,输出到日志文件的demo
3.configFileUse, 使用log4cpp.conf配置文件输出日志
1.下载代码
git clone https://git.code.sf.net/p/log4cpp/codegit log4cpp-codegit
2.编译与安装
cd log4cpp-codegit/
./autogen.sh
./configure
make
make check
make install
3.配置环境变量
vi /etc/profile
加入
LD_LIBRARY_PATH=:$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH
source /etc/profile 使其生效
4.测试代码
4.1不使用配置文件的测试代码:
g++ log4cpp_Test_FileAppender.cpp -o log4cpp_Test_FileAppender -llog4cpp -lpthread
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/BasicLayout.hh>
#include <log4cpp/BasicLayout.hh>
#include <log4cpp/PatternLayout.hh>
#define FILE_LOG "./myfile.log"
int main()
{
//log4cpp::Layout* layout = new log4cpp::BasicLayout();
// 1. 初始化一个pLayout 对象
log4cpp::PatternLayout *pLayout = new log4cpp::PatternLayout();
pLayout->setConversionPattern("%d: %p %c %x: %m%n");
// 2. 初始化一个appender 对象
log4cpp::Appender* appender = new log4cpp::FileAppender("FileAppender",FILE_LOG);
// 3. 把layout对象附着在appender对象上
appender->setLayout(pLayout);
// 4. 实例化一个category对象
log4cpp::Category& info_log = log4cpp::Category::getInstance("myinfo");
// 5. 设置additivity为false,替换已有的appender
info_log.setAdditivity(false);
// 5. 把appender对象附到category上
info_log.setAppender(appender);
// 6. 设置category的优先级,低于此优先级的日志不被记录
info_log.setPriority(log4cpp::Priority::INFO);
// 记录一些日志
info_log.info("test info log");
info_log.debug("test debug log");//不会输出
// 其他记录日志方式
info_log.log(log4cpp::Priority::ERROR, "test error log");
log4cpp::Priority::PriorityLevel priority;
bool this_is_critical = true;
if(this_is_critical)
priority = log4cpp::Priority::CRIT;
else
priority = log4cpp::Priority::DEBUG;
info_log.log(priority,"Set Priority::CRIT log");
log4cpp::Category::shutdown();
return 0;
}
4.2:使用配置文件
4.2.1配置内容:
#说明:log4cpp 的 category 分为 rootCategory 和其它自定义的 category。
#而每个category都可以输出到多个appender。并且category也是有包含关系的。
#rootCategory就是所有category的根,下述例子中名字分别为son和daughter其父category为sample。
#son产生的log会写到son和sample的appender中。daughter同理。
#定义 root category 的属性 ,级别为DEBUG,有一个名称为console的appender
log4cpp.rootCategory=ERROR, console
#定义 console 属性
log4cpp.appender.console=ConsoleAppender
log4cpp.appender.console.layout=PatternLayout
log4cpp.appender.console.layout.ConversionPattern=%d [%p] - %m%n
#定义 sample category 的属性
log4cpp.category.sample=ERROR, sample
#定义 sample appender 的属性
log4cpp.appender.sample=FileAppender
log4cpp.appender.sample.fileName=sample.log
log4cpp.appender.sample.layout=PatternLayout
log4cpp.appender.sample.layout.ConversionPattern=%d [%p] - %m%n
#定义 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
4.2.2测试代码:
#include <log4cpp/PropertyConfigurator.hh>
#include <log4cpp/Category.hh>
int main() {
// 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& 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"));
// 正常使用这些category对象进行日志处理。
root.fatal("root's log");
sample.error("sample's log");
sample_son.debug("sample.son's log");
sample_daughter.debug("sample.daughter's log");
return 0;
}
}