log4cpp学习笔记

来源:互联网 发布:mysql 分区 分表 编辑:程序博客网 时间:2024/05/22 00:55

一.简介

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

二.编译

1.编译程序时记得加上 -llog4cpp -lpthread
log4cpp是线程安全的,调试多线程程序十分好用(多线程用printf调试听说会挂起线程,效率低下)

三.简单示例

log4app使用单例模式。

  • Appender可以定位日志输出信息 ,如console,或保存到文件中
  • Category可以有不同的输出种类,Root是根输出,可以创建子输出,分别对应到不同的输出位置。
  • Layout是输出格式,其子类PatternLayout可以自定义
#include<iostream>#include"log4cpp/Category.hh"#include"log4cpp/FileAppender.hh"#include"log4cpp/OstreamAppender.hh"#include"log4cpp/Layout.hh"#include"log4cpp/BasicLayout.hh"#include"log4cpp/Priority.hh"using namespace std;int main(int argc,char *argv[]) {    log4cpp::Appender *appender1 = new log4cpp::OstreamAppender("console",&std::cout);    appender1->setLayout(new log4cpp::BasicLayout());    log4cpp::Appender *appender2 = new log4cpp::FileAppender("default","program.log");    appender2->setLayout(new log4cpp::BasicLayout());    log4cpp::Category &root = log4cpp::Category::getRoot();    root.setPriority(log4cpp::Priority::WARN);    root.addAppender(appender1);    log4cpp::Category &sub1 = log4cpp::Category::getInstance(std::string("sub1"));    sub1.addAppender(appender2);    //函数形式打印消息    root.error("root error");    root.info("root info");    sub1.error("sub1 error");    sub1.warn("sub1 warn");    //打印风格输出日志变量    root.warn("%d + %d = %s ?",1,1,"two");    //流式输出日志信息    root << log4cpp::Priority::ERROR <<"Streamed root error" ;    root << log4cpp::Priority::INFO<<"Streamed root info" ;    sub1 << log4cpp::Priority::ERROR<<"Streamed sub1 error";    sub1 << log4cpp::Priority::WARN<<"Streamed sub1 warn" ;}

运行后目录下会生成program.log日志文件
截图:
这里写图片描述

使用配置文件输出日志

配置文件log4cpp.properties如下:

# log4cpp.propertieslog4cpp.rootCategory=DEBUG, rootAppenderlog4cpp.category.sub1=DEBUG, A1, A2log4cpp.category.sub1.sub2=DEBUG, A3log4cpp.appender.rootAppender=ConsoleAppenderlog4cpp.appender.rootAppender.layout=PatternLayoutlog4cpp.appender.rootAppender.layout.ConversionPattern=%d [%p] %m%n log4cpp.appender.A1=FileAppenderlog4cpp.appender.A1.fileName=A1.loglog4cpp.appender.A1.layout=BasicLayoutlog4cpp.appender.A2=FileAppenderlog4cpp.appender.A2.threshold=WARNlog4cpp.appender.A2.fileName=A2.loglog4cpp.appender.A2.layout=PatternLayoutlog4cpp.appender.A2.layout.ConversionPattern=%d [%p] %m%n log4cpp.appender.A3=RollingFileAppenderlog4cpp.appender.A3.fileName=A3.loglog4cpp.appender.A3.maxFileSize=200log4cpp.appender.A3.maxBackupIndex=1log4cpp.appender.A3.layout=PatternLayoutlog4cpp.appender.A3.layout.ConversionPattern=%d [%p] %m%n 
#include <log4cpp/Category.hh>#include <log4cpp/PropertyConfigurator.hh>int main(int argc, char* argv[]){    std::string initFileName = "log4cpp.properties";    log4cpp::PropertyConfigurator::configure(initFileName);    log4cpp::Category& root = log4cpp::Category::getRoot();    log4cpp::Category& sub1 =         log4cpp::Category::getInstance(std::string("sub1"));    log4cpp::Category& sub2 =         log4cpp::Category::getInstance(std::string("sub1.sub2"));    root.warn("Storm is coming");    sub1.debug("Received storm warning");    sub1.info("Closing all hatches");    sub2.debug("Hiding solar panels");    sub2.error("Solar panels are blocked");    sub2.debug("Applying protective shield");    sub2.warn("Unfolding protective shield");    sub2.info("Solar panels are shielded");    sub1.info("All hatches closed");    root.info("Ready for storm.");    log4cpp::Category::shutdown();    return 0;}

运行截图:
这里写图片描述

目录下会多出几个日志文件:
A1.log A2.log
A3.log A3.log.1(备份)

0 0