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
- log4cpp学习笔记
- log4cpp学习
- log4cpp 使用笔记
- log4Cpp学习(一)了解log4Cpp
- log4Cpp学习(二)—log4Cpp构成要素
- Log4cpp学习记录
- log4cpp
- Log4cpp
- log4cpp
- Log4cpp
- log4cpp
- log4cpp 学习过程(一) 概述
- log4cpp学习总结(1)
- log4Cpp学习(本文转载)
- log4cpp 学习过程(三) 时间戳---- log4cpp/TimeStamp
- log4cpp 学习过程(四) ---- log4cpp在VS2003上的编译
- log4cpp 学习过程(二) ----整体架构
- log4Cpp学习(三)—ConsoleAppender类
- leetcode 51: N-Queens
- STM32 boot跳转到APP的Jump_Address()分析
- NOIP 2011TG 解题报告
- 关于SQLServer数据库的问题
- Leetcode Q5:Longest Palindromic Substring
- log4cpp学习笔记
- hdoj 1022 火车进出站问题
- js获取随机数
- hadoop mapreduce的job的几种运行模式
- #include与#import的区别以及@class
- 11noipday2-1
- VIEW当中自定义属性的使用
- SSH学习三 SESSION
- Animation基础