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

 

 

 


推荐阅读
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 关于进程的复习:#管道#数据的共享Managerdictlist#进程池#cpu个数1#retmap(func,iterable)#异步自带close和join#所有 ... [详细]
  • Spring Boot与Graylog集成实现微服务日志聚合与分析
    本文介绍了如何在Graylog中配置输入源,并详细说明了Spring Boot项目中集成Graylog的日志聚合和分析方法,包括logback.xml的多环境配置。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 本文详细介绍了如何在Android应用中实现重复报警功能。示例代码可在以下路径找到:https://developer.android.com/samples/RepeatingAlarm/index.html。首先,我们将从Manifest文件开始分析。 ... [详细]
  • 本文介绍了一种通过设置主题(Theme)来实现快速启动的Android引导页,并详细说明了如何避免因不同屏幕分辨率导致的图片拉伸问题。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • Panabit应用层流量管理解决方案
    Panabit是一款国内领先的应用层流量管理解决方案,提供高度开放且免费的专业服务,尤其擅长P2P应用的精准识别与高效控制。截至2009年3月25日,该系统已实现对多种网络应用的全面支持,有效提升了网络资源的利用效率和安全性。 ... [详细]
  • 【原创】《Linux设备驱动程序》学习之循序渐进---调试技术第四章---调试技术内核编程带有它自己的,独特的调试挑战性.内核代码无法轻易地在一个调试器下运行,也无法轻易的被跟踪,因为 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • Linux学习笔记:psef、ps aux、kill9
    一、查看进程命令1.ps命令Linux中的ps命令是ProcessStatus的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • 本文介绍了在RHEL 7中的系统日志管理和网络管理。系统日志管理包括rsyslog和systemd-journal两种日志服务,分别介绍了它们的特点、配置文件和日志查询方式。网络管理主要介绍了使用nmcli命令查看和配置网络接口的方法,包括查看网卡信息、添加、修改和删除配置文件等操作。 ... [详细]
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社区 版权所有