热门标签 | 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

 

 

 


推荐阅读
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文详细介绍了Oracle数据库中审计日志(audit trail)的配置方法及各参数选项的功能,包括如何启用系统范围的审计记录,以及如何将审计数据存储在不同的位置和格式。 ... [详细]
  • 深入理解Play Framework 1.2.7中的缓存机制
    本文探讨了Play Framework 1.2.7版本中提供的缓存解决方案,包括Ehcache和Memcached的集成与使用。文章详细介绍了缓存相关的类及其功能,以及如何通过配置选择合适的缓存实现。 ... [详细]
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社区 版权所有