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

 

 

 


推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • andr ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 本文详细介绍了 Java 中的 org.apache.hadoop.registry.client.impl.zk.ZKPathDumper 类,提供了丰富的代码示例和使用指南。通过这些示例,读者可以更好地理解如何在实际项目中利用 ZKPathDumper 类进行注册表树的转储操作。 ... [详细]
  • MyBatis入门指南
    本文详细介绍了MyBatis的基础知识,包括如何整合日志框架(如log4j和logback),使用外部JDBC文件,getMapper()方法的应用,以及别名设置等技巧。 ... [详细]
  • 深入理解Play Framework 1.2.7中的缓存机制
    本文探讨了Play Framework 1.2.7版本中提供的缓存解决方案,包括Ehcache和Memcached的集成与使用。文章详细介绍了缓存相关的类及其功能,以及如何通过配置选择合适的缓存实现。 ... [详细]
  • 本文介绍了如何在Java中使用`JCheckBoxMenuItem.setMnemonic()`方法,并提供了多个实际应用的代码示例。 ... [详细]
  • 优雅地记录API调用时长
    本文旨在探讨如何高效且优雅地记录API接口的调用时长,通过实际案例和代码示例,帮助开发者理解并实施这一技术,提高系统的可观测性和调试效率。 ... [详细]
  • Hibernate全自动全映射ORM框架,旨在消除sql,是一个持久层的ORM框架1)、基础概念DAO(DataAccessorOb ... [详细]
  • 本文介绍如何通过整合SparkSQL与Hive来构建高效的用户画像环境,提高数据处理速度和查询效率。 ... [详细]
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社区 版权所有