2)输出源(Appender)用来输出日志(被layout格式化后)到一些设备上,比如文件、命令行、内存等。也可以定义自己的appender输出日志信息到别的设备上。log4cpp提
供的appender如下: FileAppender 输出到文件 RollingFileAppender 输出到回卷文件,即当文件到达某个大小后回卷 ConsoleAppender 输出到控制台
log4cpp::IdsaAppender // 发送到IDS或者logger,
log4cpp::FileAppender // 输出到文件
log4cpp::RollingFileAppender // 输出到回卷文件,即当文件到达某个大小后回卷
log4cpp::OstreamAppender // 输出到一个ostream类
log4cpp::RemoteSyslogAppender // 输出到远程syslog服务器
log4cpp::StringQueueAppender // 内存队列
log4cpp::SyslogAppender // 本地syslog
log4cpp::Win32DebugAppender // 发送到缺省系统调试器
log4cpp::NTEventLogAppender // 发送到win 事件日志
3)布局(Layout):显示样式PatternLayout表示让用户根据类似于C语言printf函数的转换模式来指定输出格式
log4cpp::BasicLayout // 以“时间戳 优先级(priority,下文介绍)
// 类别(category,下文介绍)
// NDC标签
log4cpp::PatternLayout // 让用户根据类似于 C 语言 printf 函数的转换模式来指定输出格式。
log4cpp::SimpleLayout // 以“优先级(priority) - 日志信息”格式显
三个组件之间的关系:
Category和Appender的关系是:多个Appender可以附加到一个Category上,这样一个日志消息可以同时输出到多个设备上。
Appender和Layout的关系是:Layout附加在Appender上,appender调用layout处理完日志消息后,记录到某个设备上。
三、基本使用步骤
1)log4cpp下载路径: https://sourceforge.net/projects/log4cpp/
2)使用VS2019 编译环境:编译msvc10下log4cppLIB静态库
3)将include目录 与log4cppLIB.lib放入工程
4)代码如下
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
#include
#pragma comment(lib, "log4cppLIB.lib")
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
log4cpp::PatternLayout* pLayout1 = new log4cpp::PatternLayout();//创建一个Layout; // 让用户根据类似于 C 语言 printf 函数的转换模式来指定输出格式。格式定义见代码附带文档。
pLayout1->setConversionPattern("%d: %p %c %x: %m%n");//指定布局格式;
log4cpp::PatternLayout* pLayout2 = new log4cpp::PatternLayout();// 让用户根据类似于 C 语言 printf 函数的转换模式来指定输出格式。格式定义见代码附带文档。
pLayout2->setConversionPattern("%d: %p %c %x: %m%n");
log4cpp::Appender* fileAppender = new log4cpp::FileAppender("fileAppender", "wxb.log");//创建一个Appender; // 输出到文件
fileAppender->setLayout(pLayout1);//将指定的Layout添加到Appender;
log4cpp::RollingFileAppender* rollfileAppender = new log4cpp::RollingFileAppender(
"rollfileAppender", "harollwxb.log", 5 * 1024 , 9); // 输出到回卷文件,即当文件到达某个大小后回卷
rollfileAppender->setLayout(pLayout2);
log4cpp::Category& root = log4cpp::Category::getRoot().getInstance("RootName");//从系统中得到Category的根;
root.addAppender(fileAppender);//将Appender添加到Category;
root.addAppender(rollfileAppender);
root.setPriority(log4cpp::Priority::DEBUG);//设置Category的优先级;
//开始记录日志;
for (int i &#61; 0; i <100; i&#43;&#43;)
{
string strError;
ostringstream oss;
oss << i << ":Root Error Message!";
strError &#61; oss.str();
root.error(strError);
}
log4cpp::Category::shutdown();//关闭Category;
return 0;
}
- 配置文件log4cpp.conf内容
log4cpp.rootCategory&#61;DEBUG, rootAppender
log4cpp.category.sub1&#61;,A1
log4cpp.category.sub2&#61;INFO,A2
log4cpp.additivity.sub2&#61;false
log4cpp.category.sub3&#61;ERROR,A3
log4cpp.additivity.sub3&#61;false
log4cpp.appender.rootAppender&#61;org.apache.log4cpp.ConsoleAppender
log4cpp.appender.rootAppender.layout&#61;org.apache.log4cpp.BasicLayout
log4cpp.appender.A1&#61;org.apache.log4cpp.FileAppender
log4cpp.appender.A1.fileName&#61;./log/A1.log
log4cpp.appender.A1.layout&#61;org.apache.log4cpp.BasicLayout
log4cpp.appender.A2&#61;org.apache.log4cpp.ConsoleAppender
log4cpp.appender.A2.layout&#61;org.apache.log4cpp.PatternLayout
log4cpp.appender.A2.layout.ConversionPattern&#61;The message &#39;%m&#39; at time %d%n
log4cpp.appender.A3&#61;org.apache.log4cpp.RollingFileAppender
log4cpp.appender.A3.fileName&#61;./log/A3.log
log4cpp.appender.A3.maxFileSize&#61;50
log4cpp.appender.A3.maxBackupIndex&#61;3
log4cpp.appender.A3.backupPattern&#61;%Y-%m-%d
log4cpp.appender.A3.layout&#61;org.apache.log4cpp.PatternLayout
log4cpp.appender.A3.layout.ConversionPattern&#61;%d{%Y-%m-%d %H:%M:%S} [%p]: [%c] %m
- 代码
#include
#include
#include
#include
#include
#pragma comment(lib, "log4cppLIB.lib")
#pragma comment(lib, "ws2_32.lib")
using namespace std;
//
int readconf();
int main()
{
readconf();
}
// 读取本地配置文件
int readconf() {
// 1 读取解析配置文件
// 读取出错, 完全可以忽略&#xff0c;可以定义一个缺省策略或者使用系统缺省策略
// BasicLayout输出所有优先级日志到ConsoleAppender
try
{
log4cpp::PropertyConfigurator::configure("./log4cpp.conf");
}
catch (log4cpp::ConfigureFailure& f)
{
std::cerr << "configure problem " << f.what() << std::endl;
}
//2 实例化category对象
// 这些对象即使配置文件没有定义也可以使用&#xff0c;不过其属性继承其父category
// 通常使用引用可能不太方便&#xff0c;可以使用指针&#xff0c;以后做指针使用
log4cpp::Category& root &#61; log4cpp::Category::getRoot();
log4cpp::Category& sub1 &#61; log4cpp::Category::getInstance(std::string("sub1"));
log4cpp::Category& sub2 &#61; log4cpp::Category::getInstance(std::string("sub2"));
log4cpp::Category& sub3 &#61; log4cpp::Category::getInstance(std::string("sub3"));
//log4cpp::Category& sub4 &#61; log4cpp::Category::getInstance(std::string("sub4"));
// 正常使用这些category对象进行日志处理。
root.fatal("root&#39;s log");
// sub1 has appender A1 and rootappender. since the additivity property is set true by default
sub1.info("sub1&#39;s log");
// sub2 has appender A2 appender. since the additivity property is set to false
sub2.alert("sub2&#39;s log");
// sub3 only has A3 appender. since the additivity property is set to false
sub3.debug("sub3&#39;s log");
sub3.alert("sub3&#39;s log");
// sub4 can not be found in the config file, so the root category&#39;s appender and layout are used
//sub4.warn("sub4&#39;s log");
return 0;
}
以上信息来源于&#xff1a;
log4cpp应用速成手册
https://blog.csdn.net/jq0123/article/details/1042617
初之萌萌-Log4cpp配置文件及动态调整日志级别的方法
https://www.cnblogs.com/xiaojiaocx/p/6404718.html
log4cpp之配置文件使用方法
https://www.xuebuyuan.com/1133257.html