基于log4cpp封装日志类

一、log4cpp的使用

1. 下载log4cpp

log4cpp官方下载地址

2. 安装log4cpp

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

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

tips:如果是ARM架构的CPU可能会失败,如下面这种情况,重新执行 ./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类

#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;// 定义LogWarn宏函数
#define LogWarn(str) {                              \MyLogger *log = MyLogger::getInstance();        \log->warn(str);                                 \
}
// 定义LogError宏函数
#define LogError(str) {                             \MyLogger *log = MyLogger::getInstance();        \log->error(str);                                \
}
// 定义LogDebug宏函数
#define LogDebug(str) {                             \MyLogger *log = MyLogger::getInstance();        \log->debug(str);                                \
}
// 定义LogInfo宏函数
#define LogInfo(str) {                              \MyLogger *log = MyLogger::getInstance();        \log->info(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 *layout = new PatternLayout();layout->setConversionPattern("%d [%p] %m%n");// 绑定输出样式pConmandLineAppender->setLayout(new BasicLayout());pRollingAppender->setLayout(layout); // 设置日志过滤等级 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("%s,%s,%d: %s", __FILE__, __func__, __LINE__, msg);
}
/*** error
*/
void MyLogger::error(const char *msg) {category.error("%s,%s,%d: %s", __FILE__, __func__, __LINE__, msg);
}
/*** debug
*/
void MyLogger::debug(const char *msg) {category.debug("%s,%s,%d: %s", __FILE__, __func__, __LINE__, msg);
}
/*** info
*/
void MyLogger::info(const char *msg) {category.info("%s,%s,%d: %s", __FILE__, __func__, __LINE__, msg);
}

三、MyLogger的使用示例

方式一:单例对象

void test0()
{MyLogger *log = MyLogger::getInstance();log->warn("The log is warn message");log->error("The log is error message");log->debug("The log is debug message");log->info("The log is info message");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");
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu查看ros版本-linux查看ros版本

使用ros带的rosversion命令即可查看自己的ros版本&#xff1a; rosversion -d

如何在Windows中检测任何串行设备的COM端口?这里有一个应用程序

使用USB串行设备并不是最简单的工作流程。我们首先需要标识“设备管理器”下的COM端口,然后需要告诉应用程序使用该COM端口。 如果我们可以接收COM设备的自动通知,然后将它们配置为使用特定应用程序打开,该怎么办?Serial Port Notifier程序正是我们所需要的。 在最基本的级…

【计算机网络】UDP/TCP 协议

TCP 协议 一、传输层1. 再谈端口号2. 端口号范围划分3. 进程和端口号4. netstat5. pidof 二、UDP 协议1. UDP 协议端格式(报文)2. UDP 的特点3. 面向数据报4. UDP 的缓冲区 三、TCP 协议1. 认识 TCP2. TCP 协议段格式&#xff08;1&#xff09;4 位首部长度&#xff08;2&#…

Spring Boot+Vue前后端分离项目如何部署到服务器

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

NVidia NX 中 ROS serial软件包的安装

自己装的ROS是noetic版本&#xff0c;受限于网络&#xff0c;直接用命令安装串口包不行。于是手动安装了一次。 1 下载源码 git clone https://github.com/wjwwood/serial.git 或者直接在浏览器里面输入 https://github.com/wjwwood/serial.git 2 解压 然后在serial&#xf…

OPC UA 服务器的Web访问

基于Web 的应用非常普及&#xff0c;例如基于web 的SCADA &#xff0c;物联网 Dashboard 等等&#xff0c;那么基于Web 的应用如何访问OPC UA 服务器呢&#xff1f;本博文讨论这方面的问题。 Web 的通信方式 Web 是我们通常讲的网站&#xff0c;它由浏览器&#xff0c;HTTP 服…

sqllab第二关通关笔记

知识点整理&#xff1a; 数值型注入判断手法 1/1 1/0 回显不同错误注入函数 extractvalue(xml_flag,xpath) xml_flag&#xff1a;文件表示符xpath&#xff1a;文件路径&#xff1b;不能识别‘~’ ‘#’ 等特殊字符&#xff1b;遇到就报错并打印xpath内容~(十六进制表示)&#…

YOLOv9改进 添加可变形注意力机制DAttention

一、Deformable Attention Transformer论文 论文地址:arxiv.org/pdf/2201.00520.pdf 二、Deformable Attention Transformer注意力结构 Deformable Attention Transformer包含可变形注意力机制,允许模型根据输入的内容动态调整注意力权重。在传统的Transformer中,注意力是…

前后端链条产生的跨域问题

环境&#xff1a; vitevue3 .net 6 vsstudio2022C# asp .net core webapi 看别的up说这个第一条报错是因为&#xff1a;后端没有允许跨域导致的 解决办法: 1.在后端添加允许跨域 Program.cs //添加跨域策略builder.Services.AddCors(options >{options.AddPolicy(…

创建springboot 2.x web空项目(IDEA)

由于学习时候发现spring官网只能创建springboot3.0的项目&#xff0c;而且不支持java1.8&#xff0c;无法选择java8作为java版本&#xff0c;导致很多教程无法跟着做&#xff0c;因此记录一下可行的创建过程。 &#xff08;Tips:当前spring Initializr不支持java8的解决方式&a…

固态存储是未来|浅析SSD架构的演进与创新技术-1

常见的SSD架构中&#xff0c;包括了SSD控制器、NAND颗粒、DRAM颗粒三大组件&#xff0c;SSD控制器的固件需要兼顾坏块管理、ECC纠错、垃圾回收GC、磨损均衡WL、NAND die介质管理、缓存交互等等。 随着时代的发展&#xff0c;SSD架构&#xff0c;也不断有新的挑战和需求。基于小…

106. Dockerfile通过多阶段构建减小Golang镜像的大小

我们如何通过引入具有多阶段构建过程的Dockerfiles来减小Golang镜像的大小&#xff1f; 让我们从一个通用的Dockerfile开始&#xff0c;它负责处理基本的事务&#xff0c;如依赖项、构建二进制文件、声明暴露的端口等&#xff0c;以便为Go中的一个非常基础的REST API提供服务。…

LoadBalancer负载均衡服务调用

LoadBalancer负载均衡服务调用 1、Ribbon目前也进入维护 ​ Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。 ​ 简单的说&#xff0c;Ribbon是Netflix发布的开源项目&#xff0c;主要功能是**提供客户端的软件负载均衡算法和服务调用。**Ribbon…

有来团队后台项目-解析5

一、 husky 安装 pnpm install -D husky生成husky 配置文件 如果文件中有.git文件&#xff0c;那么直接执行 npx husky-init如果没有&#xff0c;那么先执行git init 结果&#xff1a; PS F:\company_project\demo\youlahoutaijiexi\vite-project> git init Initializ…

【敬伟ps教程】视频动画

文章目录 视频文档视频时间轴帧动画视频文档 工作区需由[基本功能]切换为[动感] 可以看到我们需从时间的维度来编辑动态视觉图像 时间轴:从时间的维度来编辑动态视觉图像 PS提供的时间轴有两种:1、视频时间轴;2、动画时间轴 新建视频文档,点击新建或Ctrl+N,预设选择“胶…

SPI机制详解

SPI机制详解 什么是SPI机制&#xff1f; SPI&#xff1a;Service Provider Interface&#xff0c;中文直译&#xff1a;服务提供者接口&#xff0c;它通过在ClassPath路径下的META-INF/service文件夹中查找文件&#xff0c;并自动加载文件里所定义的类 在面向对象的设计原则…

Device Tree (二) - dtb格式

dtb作为二进制文件被加载到内存中&#xff0c;然后由内核读取并进行解析&#xff0c;如果对dtb文件的格式不了解&#xff0c;那么在看设备树解析相关的内核代码时将会寸步难行&#xff0c;而阅读源代码才是了解设备树最好的方式&#xff0c;所以&#xff0c;如果需要更透彻的了…

【数据结构】哈希表(Hash Table)

文章目录 一&#xff1a;哈希表&#xff08;Hash Table&#xff09;1.1 简介1.2 可以将算法思想分为两个部分1.3 相关术语1.4 性质 二&#xff1a;哈希冲突2.1 什么是哈希冲突2.2 为何要避免哈希冲突2.3 如何避免哈希冲突2.4 如何减少哈希冲突2.4.1 直接地址法2.4.1 除留余数法…

工具篇--分布式定时任务springBoot 整合 elasticjob使用(3)

文章目录 前言一、Springboot 整合&#xff1a;1.1 引入jar&#xff1a;1.2 配置zookeeper 注册中心&#xff1a;1.3 定义job 业务类&#xff1a;1.4 job 注册到zookeeper&#xff1a;1.5 项目启动&#xff1a;1.5.1 zookeeper 注册中心实例&#xff1a;1.5.2 任务执行日志输出…

Ubuntu 14.04:PaddleOCR基于PaddleServing的在线服务化部署(失败)

一、 二、安装 注&#xff1a; 安装 PaddleOCR 2.3 。 因为 PaddleOCR 2.4 的 推荐环境 PaddlePaddle > 2.1.2。 https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/doc/doc_ch/environment.md 安装前的环境准备 在使用Paddle Serving之前&#xff0c;需要完…