基于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

相关文章

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

java -jar example.jar 产生的日志输出到指定文件的方法

《java-jarexample.jar产生的日志输出到指定文件的方法》这篇文章给大家介绍java-jarexample.jar产生的日志输出到指定文件的方法,本文给大家介绍的非常详细,对大家的... 目录怎么让 Java -jar example.jar 产生的日志输出到指定文件一、方法1:使用重定向1、

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

nginx配置错误日志的实现步骤

《nginx配置错误日志的实现步骤》配置nginx代理过程中,如果出现错误,需要看日志,可以把nginx日志配置出来,以便快速定位日志问题,下面就来介绍一下nginx配置错误日志的实现步骤,感兴趣的可... 目录前言nginx配置错误日志总结前言在配置nginx代理过程中,如果出现错误,需要看日志,可以把

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window