log4cpp 概述与基本使用实例(一)
log4cpp 概述与使用实例
一、log4cpp概述
Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下:
提供应用程序运行上下文,方便跟踪调试;
可扩展的、多种方式记录日志,包括命令行、文件、远程服务、回卷文件、内存、syslog服务器、Win事件日志等;
可以动态控制日志记录级别,在效率和功能中进行调整;
所有配置可以通过配置文件进行动态调整;
多语言支持,包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(log4p)等;
二、原理
Log4cpp有三个主要的组件:日志类别(Category)、输出源(Appender)和布局(Layout)。这三种类型的组件一起工作使得系统可以根据信息的类型和级别记录它们,并
且在运行时控制这些信息的输出格式和位置。
三个组件的介绍:
1)日志类别(Category)含义是:如果配置文件中设置的级别是DEBUG,则任意的log都能打印出来;但如果配置的级别是ERROR,则只有高于ERROR优先级的日志才可以打印出
来。
日志的常用优先级:DEBUG < INFO < WARN < ERROR < FATAL
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 <iostream>
#include <log4cpp/Category.hh>
#include <log4cpp/Appender.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/RollingFileAppender.hh>
#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 = 0; i < 100; i++)
{
string strError;
ostringstream oss;
oss << i << ":Root Error Message!";
strError = oss.str();
root.error(strError);
}
log4cpp::Category::shutdown();//关闭Category;
return 0;
}
- 配置文件使用方法
- 配置文件log4cpp.conf内容
log4cpp.rootCategory=DEBUG, rootAppender
log4cpp.category.sub1=,A1
log4cpp.category.sub2=INFO,A2
log4cpp.additivity.sub2=false
log4cpp.category.sub3=ERROR,A3
log4cpp.additivity.sub3=false
log4cpp.appender.rootAppender=org.apache.log4cpp.ConsoleAppender
log4cpp.appender.rootAppender.layout=org.apache.log4cpp.BasicLayout
log4cpp.appender.A1=org.apache.log4cpp.FileAppender
log4cpp.appender.A1.fileName=./log/A1.log
log4cpp.appender.A1.layout=org.apache.log4cpp.BasicLayout
log4cpp.appender.A2=org.apache.log4cpp.ConsoleAppender
log4cpp.appender.A2.layout=org.apache.log4cpp.PatternLayout
log4cpp.appender.A2.layout.ConversionPattern=The message '%m' at time %d%n
log4cpp.appender.A3=org.apache.log4cpp.RollingFileAppender
log4cpp.appender.A3.fileName=./log/A3.log
log4cpp.appender.A3.maxFileSize=50
log4cpp.appender.A3.maxBackupIndex=3
log4cpp.appender.A3.backupPattern=%Y-%m-%d
log4cpp.appender.A3.layout=org.apache.log4cpp.PatternLayout
log4cpp.appender.A3.layout.ConversionPattern=%d{%Y-%m-%d %H:%M:%S} [%p]: [%c] %m
- 代码
#include <iostream>
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/BasicLayout.hh>
#include <log4cpp/PropertyConfigurator.hh>
#pragma comment(lib, "log4cppLIB.lib")
#pragma comment(lib, "ws2_32.lib")
using namespace std;
//
int readconf();
int main()
{
readconf();
}
// 读取本地配置文件
int readconf() {
// 1 读取解析配置文件
// 读取出错, 完全可以忽略,可以定义一个缺省策略或者使用系统缺省策略
// BasicLayout输出所有优先级日志到ConsoleAppender
try
{
log4cpp::PropertyConfigurator::configure("./log4cpp.conf");
}
catch (log4cpp::ConfigureFailure& f)
{
std::cerr << "configure problem " << f.what() << std::endl;
}
//2 实例化category对象
// 这些对象即使配置文件没有定义也可以使用,不过其属性继承其父category
// 通常使用引用可能不太方便,可以使用指针,以后做指针使用
log4cpp::Category& root = log4cpp::Category::getRoot();
log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));
log4cpp::Category& sub2 = log4cpp::Category::getInstance(std::string("sub2"));
log4cpp::Category& sub3 = log4cpp::Category::getInstance(std::string("sub3"));
//log4cpp::Category& sub4 = log4cpp::Category::getInstance(std::string("sub4"));
// 正常使用这些category对象进行日志处理。
root.fatal("root's log");
// sub1 has appender A1 and rootappender. since the additivity property is set true by default
sub1.info("sub1's log");
// sub2 has appender A2 appender. since the additivity property is set to false
sub2.alert("sub2's log");
// sub3 only has A3 appender. since the additivity property is set to false
sub3.debug("sub3's log");
sub3.alert("sub3's log");
// sub4 can not be found in the config file, so the root category's appender and layout are used
//sub4.warn("sub4's log");
return 0;
}
以上信息来源于:
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
log4cpp 概述与基本使用实例(一)相关推荐
- 【Java 19】反射 - 反射机制概述、获取Class实例、类的加载与ClassLoader的理解、创建运行时类的对象、获取运行时类的完整结构、调用运行时类的指定结构、动态代理
反射机制概述.获取Class实例.类的加载与ClassLoader的理解.创建运行时类的对象.获取运行时类的完整结构.调用运行时类的指定结构.动态代理 反射 1 Java反射机制概述 1.1 Java ...
- c++ log4cpp的实现 包含使用实例和下载源码
log4cpp源码下载点击此处下载 调用对应宏定义实现日志记录功能 流程 创建一个Appender,并指定其包含的Layout 从系统中得到Category的根,将Appender添加到该Catego ...
- Mybatis入门概述及第一个Mybatis实例实现增删改查
林炳文Evankaka原创作品.转自https://blog.csdn.net/Evankaka/article/details/45647401 一.简介 1.什么是MyBatis MyBatis ...
- DBA(四):数据读写分离,MySQL多实例操作
数据读写分离 MySQL读写分离 概念:把客户端查询数据的请求和存储数据的SQL命令,分别给不同的数据库服务器处理 读写分离的原理 由MySQL代理面向客户端提供服务 收到SQL的写请求时,交给mas ...
- flac3d命令流实例大全_ANSYS APDL 疲劳分析实例附命令流
图1为一个角型板,边界条件:底端固定,顶端承受0-30kpa的压力,计算指定位置的疲劳寿命,表1给出了材料的S-N数据:图1给出了疲劳分析模型的几何尺寸. 表1 材料的N-S数据 N 100 200 ...
- mobaxterm怎么解除sessions个数限制_详解Oracle实例囚笼--限制数据库实例使用的CPU资源...
概述 当多个实例运行在同一台服务器上时,为了避免实例间的相互影响,从oracle 11gr2开始推出了实例囚笼的概念.实例囚笼能够限制数据库实例使用的CPU资源.使用实例囚笼,只需要设置CPU_COU ...
- log4cpp 的使用
一.log4cpp概述 Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下: 提供应用程序运行上下文,方便跟踪调试: 可扩展的.多种方式记录日志,包括命令 ...
- 数据预处理概述和数据清洗
文章目录 1.数据预处理概述 2.数据可视化实例 2.1 2.2 2.3 3.数据清洗 3.1缺失值处理 3.2噪声平滑 3.3异常值的检测与处理 1.数据预处理概述 数据预处理的主要作用是为将未经处 ...
- 腾讯云GPU渲染型应用场景,腾讯云GPU实例类型,快速操作入门指南
腾讯云GPU云服务器产品概述和产品优势,GPU计算型应用场景 腾讯云GPU云服务器 渲染型应用场景 腾讯云推出 GPU 渲染型 GA2 实例,搭配 AMD 最新 S7150 系列 GPU,单 GPU ...
- AWS EC2压测及实例性能
最近涉及到AWS EC2 production环境选型及server压测的问题.需要自己仔细了解AC2 性能及收费的问题. AWS 的客服需要给钱每月29刀.而不用它客服,它文档里很多问题又模糊不清. ...
最新文章
- 自然语言处理「迷惑行为大赏」,自然语言处理太难难难了!
- NoSQL 之 Morphia 操作 MongoDB
- Tungsten Fabric SDN — Service Chain — HA/LB
- Android Notification状态栏通知
- Java时区处理初学者指南
- ubuntu18.04安装、配置dosbox
- Django学习笔记《一》初始化pycharm和mysql数据库及相关环境
- [react] 函数式组件有没有生命周期?为什么?
- This dependency was not found: * !!vue-style-loader!css-loader? 解决方案
- codevs 1683 车厢重组
- -bash: cd: /.ssh: 没有那个文件或目录
- 工具------Java反编译工具XJad
- 阿里开源自研语音识别模型DFSMN
- CSLA公链以“硬实力”成业界翘楚—csla超级公链是真的吗
- Windows10资源管理器使用
- Qt笔记(五十七)之显示图片缩略图
- 操作Linux软链接引起的各种问题
- python猜密码游戏规则_Python实现的摇骰子猜大小功能小游戏示例
- ABBYY OCR SDK免费试用了!
- 如何执行代码走查活动才会有效呢