Centos下log4cpp库的使用

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;
}


}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值