基于log4cpp封装日志类

2024-03-14 14:20
文章标签 日志 封装 log4cpp

本文主要是介绍基于log4cpp封装日志类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、log4cpp的使用

1. 下载log4cpp

log4cpp官方下载地址

2. 安装log4cpp

第一步:解压 tar zxvf log4cpp-1.1.4.tar.gz
在这里插入图片描述

第二步:进入log4cpp文件夹并执行 ./configure
在这里插入图片描述

tips:如果是ARM架构的芯片可能会失败,如下面这种情况,重新执行 ./configure --build=aarch64-unknown-linux-gnu 即可
在这里插入图片描述

第三步:执行 make
第四步:执行 make check
第五步:执行 make install

3. 查看是否安装成功

安装成功后,在/usr/local/include路径下会多一个log4cpp的文件夹
在这里插入图片描述

4. 更新动态库路径缓存

!!! 不更新缓存,会导致编译时找不到库文件;请执行命令sudo ldconfig
在这里插入图片描述

5. 编写测试代码
#include <iostream>
#include <log4cpp/Category.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/BasicLayout.hh>
#include <log4cpp/Priority.hh>using namespace std;
using namespace log4cpp;int main(void) {OstreamAppender *osAppender = new OstreamAppender("console", &cout);osAppender->setLayout(new BasicLayout());Category &root = Category::getRoot();root.addAppender(osAppender);root.setPriority(Priority::DEBUG);root.error("this is a error");root.warn("this is a warn");root.shutdown();return 0;
}
6. 编译代码并运行测试

g++ test.cc -llog4cpp
在这里插入图片描述

二、自定义封装的MyLogger类

需要注意的坑: 由于__FILE__、__func____LINE__是编译器提供的预处理宏,它们是在预处理阶段就被替换掉了,如果不封装成宏函数会导致打印的行号等信息不准。

#include <iostream>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/RollingFileAppender.hh>
#include <log4cpp/BasicLayout.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/Category.hh>using namespace std;
using namespace log4cpp;// 定义拼接前缀函数
#define ConcatPrefix(str) (                     \string("[").append(__FILE__).append(",")    \.append(__func__).append(",")               \.append(to_string(__LINE__)).append("]: ")  \.append(str) )// 定义LogWarn宏函数
#define LogWarn(str) {                              \MyLogger *log = MyLogger::getInstance();        \log->warn(ConcatPrefix(str).c_str());           \
}
// 定义LogError宏函数
#define LogError(str) {                             \MyLogger *log = MyLogger::getInstance();        \log->error(ConcatPrefix(str).c_str());          \
}
// 定义LogDebug宏函数
#define LogDebug(str) {                             \MyLogger *log = MyLogger::getInstance();        \log->debug(ConcatPrefix(str).c_str());          \
}
// 定义LogInfo宏函数
#define LogInfo(str) {                              \MyLogger *log = MyLogger::getInstance();        \log->info(ConcatPrefix(str).c_str());           \
}class MyLogger
{
public:static MyLogger *getInstance();static void destroyInstance();void warn(const char *msg);void error(const char *msg);void debug(const char *msg);void info(const char *msg);private:MyLogger();~MyLogger();Category &category;static MyLogger *pInstance;    
};
// 初始化静态对象
MyLogger *MyLogger::pInstance = nullptr;
// 无参构造函数
MyLogger::MyLogger() :category(Category::getInstance("MyLogger")) {// 定义输出到命令行的AppenderOstreamAppender *pConmandLineAppender = new OstreamAppender("comandLine", &cout); // 定义输出到回卷文件的AppenderRollingFileAppender *pRollingAppender = new RollingFileAppender("rollingFile", "mylogger.log", 1024, 3);// 定义日志样式PatternLayout *layout1 = new PatternLayout();layout1->setConversionPattern("%d [%p] %m%n");PatternLayout *layout2 = new PatternLayout();layout2->setConversionPattern("%d [%p] %m%n");// 绑定输出样式pConmandLineAppender->setLayout(layout1);pRollingAppender->setLayout(layout2); // 设置日志过滤等级 category.setPriority(Priority::DEBUG);    // 设置输出位置category.setAppender(pConmandLineAppender);category.setAppender(pRollingAppender);
}
/*** 获取单例对象 
*/
MyLogger *MyLogger::getInstance() {if (pInstance == nullptr) {pInstance = new MyLogger();}return pInstance;
}
/*** 销毁单例对象
*/
void MyLogger::destroyInstance() {if (pInstance != nullptr) {delete pInstance;pInstance = nullptr;}
}
/*** 析构函数
*/
MyLogger::~MyLogger() {category.shutdown();cout << "~MyLogger()" << endl;
}
/*** warn
*/
void MyLogger::warn(const char *msg) {category.warn(msg);
}
/*** error
*/
void MyLogger::error(const char *msg) {category.error(msg);
}
/*** debug
*/
void MyLogger::debug(const char *msg) {category.debug(msg);
}
/*** info
*/
void MyLogger::info(const char *msg) {category.info(msg);
}

三、MyLogger的使用示例

方式一:单例对象

void test0()
{MyLogger *log = MyLogger::getInstance();log->warn(ConcatPrefix("The log is warn message").c_str());log->error(ConcatPrefix("The log is error message").c_str());log->debug(ConcatPrefix("The log is debug message").c_str());log->info(ConcatPrefix("The log is info message").c_str());MyLogger::destroyInstance();
}

方式二:宏函数

void test1() 
{LogWarn("The log is warn message");LogError("The log is error message");LogDebug("The log is debug message");LogInfo("The log is info message");
}

生成效果:
在这里插入图片描述

这篇关于基于log4cpp封装日志类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/808697

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

MySQL 打开binlog日志的方法及注意事项

《MySQL打开binlog日志的方法及注意事项》本文给大家介绍MySQL打开binlog日志的方法及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Nacos日志与Raft的数据清理指南

《Nacos日志与Raft的数据清理指南》随着运行时间的增长,Nacos的日志文件(logs/)和Raft持久化数据(data/protocol/raft/)可能会占用大量磁盘空间,影响系统稳定性,本... 目录引言1. Nacos 日志文件(logs/ 目录)清理1.1 日志文件的作用1.2 是否可以删除

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、