热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

log4cpp概述与基本使用实例(一)

log4cpp概述与使用实例一、log4cpp概述Log4cpp是一个开源的C类库,它提供了C程序中使用日志和跟踪调试的功能,它的优点如下࿱

  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

 

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;

}

 

 

 

 

 

 

 


  • 配置文件使用方法

  1. 配置文件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

 


  1. 代码

#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

 

 

 


推荐阅读
  • 利用Dubbo的SPI扩展容器
    在实际开发中,很多Dubbo的服务提供者都会运行在web容器上,如果提供者服务上同时对外 ... [详细]
  • python 鸭子类型_Python中的鸭子输入是什么?
    python鸭子类型Python遵循EAFP(比许可更容易请求宽恕)而不是LBYL(跨越式)。EAFP的Python哲学在某 ... [详细]
  • python-去除字符串中特定字符一、去掉字符串两端字符:strip(,rstrip(,lstrip(s.strip(#删除两边(头尾空字符,默认是空字符s. ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 学习mybatis的基础知识:mybatis入门教程(二)
    2019独角兽企业重金招聘Python工程师标准2.3MyBatisprintsql在log4j.properties配置文件中添加如下配置,让mybatis打 ... [详细]
  • springboot日志【转】【补】
     市面上的日志框架日志门面(日志的抽象层)日志实现JCL(JakartaCommonsLogging)(2014)SLF4j(SimpleLoggingFacadeforJava) ... [详细]
  • java日志框架详解
    Java日志框架详解1.常用日志框架1.1Java常用日志框架类别1.2Java常用日志框架历史1.3两大日志接口阵营1.3.1基于CommonsLogging接口实现的常用日志框 ... [详细]
  • 基本信息|根源_SpringBoot 监控统计:SQL监控慢SQL记录Spring监控去广告
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringBoot监控统计:SQL监控慢SQL记录Spring监控去广告相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Bootstrap datetimepicker控件 日期时间选择器 简单使用
    bootstrap-datetimepicker日期控件简单使用应用场景:表单日期 ... [详细]
  • 保姆级使用PyTorch训练与评估自己的HorNet网络教程
    文章目录前言0.环境搭建&快速开始1.数据集制作1.1标签文件制作1.2数据集划分1.3数据集信息文件制作2.修改参数文件3.训练4.评估5.其他教程前言项目地址: ... [详细]
  • Day17_16_SpringCloud教程之Feign高级功能详解
    Feign高级功能详解注意:本篇Feign的高级功能实现请参考上一篇博客.Feign的高级功能实现以上一篇博客代码为基础,我们主要修改service_feign_consume ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Metabase v0.41.4 发布,解决 log4j2 漏洞问题
    Metabase发布了v0.41.4版本。Metabase是一个简单的分析工具,通过给公司成员提问,从得到的数据中进行分析、学习。此版本更新内容如下:Bug修复通过更新log4j2到2.15.0解决CVE-2021-44228安全漏洞 ... [详细]
author-avatar
qaz9
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有