log4cpp简单使用及踩到的坑

Posted cppthomas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4cpp简单使用及踩到的坑相关的知识,希望对你有一定的参考价值。

log4cpp是log4j的一个扩展, C++开发者可用该库记录日志,可输出到终端,亦可保存到文件。

下面简单demo展示如何输出日志到输出终端。

 1 #include <iostream>
 2 #include <log4cpp/Category.hh>
 3 #include <log4cpp/OstreamAppender.hh>
 4 #include <log4cpp/Priority.hh>
 5 #include <log4cpp/PatternLayout.hh>
 6 using namespace std;
 7 
 8 int main(int argc, char const *argv[])
 9 {
10     log4cpp::OstreamAppender app("osAppender", &cout);
11 
12     log4cpp::PatternLayout *layout = new log4cpp::PatternLayout();
13     layout->setConversionPattern("%d: %p %c : %m%n");
14     app.setLayout(layout);
15 
16     log4cpp::Category &root = log4cpp::Category::getRoot();
17     log4cpp::Category &infoCategory = root.getInstance(string(argv[0]));
18         
19     infoCategory.addAppender(app);
20     infoCategory.setPriority(log4cpp::Priority::INFO);
21 
22     infoCategory.info("system is running...");
23     infoCategory.warn("system has got a warn...");
24     infoCategory.error("system has got an error...");
25     infoCategory.fatal("system has crashed....");
26 
27     log4cpp::Category::shutdown();
28     return 0;
29 }

第10行,创建一个输出器,ostreamAppender(const streing &name, ostream *stream), name为该输出器的名字,可随意命名,最好唯一, stream输出流对象指针

第12-13行,创建一个布局对象,实际功能为定义日志输出格式: %d-日期, %p-优先级, %c-策略名, %m-消息体, %n-换行

第14行, 格式化ostreamAppender对象的输出格式

第16-20行, 创建category对象, category主要功能是输出日志,根据Appender对象的不同,将日志输出到不同的对象; getInstance(const string &name), name为策略的名字,一般的,我们使用程序名

第22-25行, 以何种优先级输出日志

第27行, 关闭一系列对象

上述info(), error()等函数,其参数亦可采用printf()函数参数类型,格式化消息体

注意:

  上述简单的demo,有个地方需要特别注意,在创建layout对象的时候,一定要创建在堆上,原因在第14行, 次layout指针作为引用传递到ostreamAppender类的最顶层基类,作为其成员对象,在ostreamAppender对象退出其声明周期时,其顶层基类会调用析构函数释放layout指针内存,如果layout是创建在栈上,会导致程序崩溃。

 

以上是关于log4cpp简单使用及踩到的坑的主要内容,如果未能解决你的问题,请参考以下文章

Esxi虚拟机安装Ros+Openwrt软路由双系统简单分享(踩到的坑,很大的坑)

我用select做多路复用踩到的坑

使用shutil.move时踩到的坑

使用nohup+& 踩到的坑

我踩到的关于Fragment 状态的保存和恢复的坑

Laravel 会话使用 Memcached 踩到的坑