linux qt 使用log4cpp库

一、日志库下载

下载地址:https://log4cpp.sourceforge.net/
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、日志库解压,编译

1.将文件夹解压出来
在这里插入图片描述
2.进入文件夹内部,打开终端
在这里插入图片描述
3.终端中依次输入以下命令
mkdir build
./configure --prefix=$(pwd)/build
make
make install
一般来说不会报错,在build目录下就可以看到生成的库
在这里插入图片描述

三、使用编译好的库

1.将上面生成的两个文件夹:include lib直接拷贝到测试工程目录下
(自己新建一个测试工程,不用界面)
在这里插入图片描述
(你可以直接放将include lib文件夹放在根目录,我这里新建一个文件夹将它们都放进去)
2.在.pro中写入

LIBS += -L$$PWD/log4cpp/lib/ -llog4cppINCLUDEPATH += $$PWD/log4cpp/include
DEPENDPATH += $$PWD/log4cpp/include

下面直接上代码

//log.h
#ifndef LOG_H
#define LOG_H
#include <QString>
#include <log4cpp/Category.hh>
#include <log4cpp/Appender.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/Layout.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/RollingFileAppender.hh>class Log
{
public:static Log& Instance();void init(QString fileName="");void setConsoleOutput(bool enable = true);void setFilePriority(log4cpp::Priority::Value priority);void setConsolePriority(log4cpp::Priority::Value priority);bool isConsoleEnable();Log(const Log&)=delete;Log&operator=(const Log&)=delete;void debug(const QString &message);void info(const QString &message);void error(const QString &message);void warn(const QString &message);
private:Log();log4cpp::Category& m_category;log4cpp::Appender* m_fileAppender;log4cpp::Appender* m_consoleAppender;bool m_consoleEnabled;
};#endif // LOG_H
//log.cpp
#include "log.h"
#include <QCoreApplication>
#include <QStandardPaths>
#include <QDir>
#include <iostream>
Log& Log::Instance()
{static Log log ;return log;
}void Log::init(QString fileName)
{//文件名QString actualAppName = fileName.isEmpty() ? QCoreApplication::applicationName() : fileName;if (actualAppName.isEmpty()) {actualAppName = "LOG";}// 设置日志文件QString logFileName = QString("%1.log").arg(actualAppName);// 文件Appenderlog4cpp::PatternLayout* fileLayout = new log4cpp::PatternLayout();fileLayout->setConversionPattern("%d [%p] %m%n");m_fileAppender = new log4cpp::RollingFileAppender("fileAppender",logFileName.toStdString(),10 * 1024 * 1024,  // 10MB5);                // 保留5个备份m_fileAppender->setLayout(fileLayout);m_fileAppender->setThreshold(log4cpp::Priority::DEBUG);m_category.addAppender(m_fileAppender);//启动控制台输出setConsoleOutput(true);// 输出日志头m_category.notice("===========================================");m_category.notice(QString("===  %1 Started (v%2) ===").arg(actualAppName).arg(QCoreApplication::applicationVersion()).toStdString());m_category.notice(QString("===  Log file: %1 ===").arg(logFileName).toStdString());m_category.notice("===========================================");
}void Log::setConsoleOutput(bool enable)
{if (enable == m_consoleEnabled) return;if (enable) {log4cpp::PatternLayout* consoleLayout = new log4cpp::PatternLayout();// 彩色控制台输出consoleLayout->setConversionPattern("\033[36m%d\033[0m [\033[32m%p\033[0m] %m%n");m_consoleAppender = new log4cpp::OstreamAppender("console", &std::cout);m_consoleAppender->setLayout(consoleLayout);m_consoleAppender->setThreshold(log4cpp::Priority::DEBUG);m_category.addAppender(m_consoleAppender);} else {if (m_consoleAppender) {m_category.removeAppender(m_consoleAppender);delete m_consoleAppender;m_consoleAppender = nullptr;}}m_consoleEnabled = enable;
}void Log::setFilePriority(log4cpp::Priority::Value priority)
{//设置日志级别,低于priority级别的将不会输出//DEBUG < INFO < NOTICE < WARN < ERROR < CRIT < ALERT < FATAL = EMERGm_category.setPriority(priority);
}void Log::setConsolePriority(log4cpp::Priority::Value priority)
{if (m_consoleAppender) {m_consoleAppender->setThreshold(priority);}
}bool Log::isConsoleEnable()
{return m_consoleEnabled;
}void Log::info(const QString &message)
{m_category.info(message.toStdString());
}void Log::error(const QString &message)
{m_category.error(message.toStdString());
}void Log::warn(const QString &message)
{m_category.warn(message.toStdString());
}void Log::debug(const QString &message)
{m_category.debug(message.toStdString());
}Log::Log():m_category(log4cpp::Category::getInstance("QtLogger")),m_fileAppender(nullptr),m_consoleAppender(nullptr),m_consoleEnabled(false)
{
}
//main.cpp
#include <QApplication>
#include "log.h"
int main(int argc, char *argv[])
{QApplication a(argc, argv);// MainWindow w;// w.show();Log::Instance().init();Log::Instance().setFilePriority(log4cpp::Priority::DEBUG);Log::Instance().setConsolePriority(log4cpp::Priority::INFO);Log::Instance().debug("这是一条debug");Log::Instance().info("这是一条info");Log::Instance().error("zheshi yitiao error");std::cout<<"endl"<<std::endl;return a.exec();

结束

这样可以看到在文件中输出的日志和在控制台输出的日志

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

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

相关文章

探索阿里云Data Integration:数据同步的魔法工具

引言在当今数字化时代&#xff0c;数据已成为企业的核心资产&#xff0c;如同企业发展的 “燃料”&#xff0c;驱动着业务的增长与创新。从用户行为数据到业务运营数据&#xff0c;从市场趋势数据到供应链数据&#xff0c;每一个数据点都蕴含着巨大的价值&#xff0c;能够为企业…

【Java面试】Redis的poll函数epoll函数区别?

Redis 在选择 poll 和 epoll 时主要基于性能需求、连接规模、操作系统支持等因素。以下是具体场景的对比与选择建议&#xff1a;1. 何时使用 poll 函数&#xff1f;适用场景&#xff1a; 跨平台兼容性需求&#xff1a;poll 在几乎所有操作系统&#xff08;如 Windows、BSD、Lin…

RPC--RPCHandler的实现

在RPC框架中&#xff0c;Handler用于接收RpcRequest&#xff0c;经过处理后返回RpcResponseSlf4jpublic class RpcRequestHandler {private final ServiceProvider serviceProvider;//获取一个单例模式的服务提供类public RpcRequestHandler() {serviceProvider SingletonFact…

C#读取文件夹和文件列表:全面指南

C#读取文件夹和文件列表&#xff1a;全面指南 在 C# 开发中&#xff0c;经常需要获取文件夹中的文件列表或子文件夹结构&#xff0c;例如文件管理器、批量处理工具、备份程序等场景。本文将详细介绍 C# 中读取文件夹和文件列表的各种方法&#xff0c;包括基础操作、递归遍历、过…

从小白到进阶:解锁linux与c语言高级编程知识点嵌入式开发的任督二脉(1)

【硬核揭秘】Linux与C高级编程&#xff1a;从入门到精通&#xff0c;你的全栈之路&#xff01;第一部分&#xff1a;初识Linux与环境搭建&#xff0c;玩转软件包管理——嵌入式开发的第一道“坎”嘿&#xff0c;各位C语言的“卷王”们&#xff01;你可能已经习惯了在Windows或m…

.net开源库SignalR

.NET开源库SignalR&#xff1a;打造实时Web应用的利器 在当今的Web开发领域&#xff0c;实时性已经成为了许多应用的核心需求。无论是实时聊天、实时数据监控还是实时游戏&#xff0c;都需要服务器能够及时地将数据推送给客户端。而.NET开源库SignalR&#xff0c;正是满足这一…

SQL Server不同场景批量插入数据的方式详解

INSERT INTO...VALUES多行语法 该方法适用于单次插入少量数据(通常<1000行),语法简洁直观。示例: INSERT INTO Employees (EmployeeID, Name, Department) VALUES (101, Zhang San, IT),(102, Li Si, HR),(103, Wang Wu, Finance)优点:语法简单易理解,适合开发测试环…

Day08-Flask 或 Django 简介:构建 Web 应用程序

Flask 或 Django 简介&#xff1a;构建 Web 应用程序 网络开发领域提供了丰富的工具和框架&#xff0c;而 Python 作为一门多功能的语言&#xff0c;在构建健壮且可扩展的 Web 应用方面脱颖而出。本课程将作为你使用 Python 进行 Web 开发的入门指南&#xff0c;特别聚焦于两个…

k8s多集群管理中的联邦和舰队如何理解?

在 Kubernetes 多集群管理中&#xff0c;联邦&#xff08;Federation&#xff09;和舰队&#xff08;Fleet&#xff09;是两种不同的方法&#xff0c;用于管理和协调多个 Kubernetes 集群。下面是对这两种方法的详细解释&#xff1a; 联邦&#xff08;Federation&#xff09; K…

Docker部署MySQL镜像

1.拉取镜像 # 拉取指定版本的MySQL镜像 docker pull mysql:8.02.创建挂载目录 # 自己创建好如下三个文件夹 路径任意 [rootiZuf6aigs7rxe6f6oifq7vZ mysql]# ll 总用量 12 drwxr-xr-x 2 root root 4096 7月 7 10:25 config drwxr-xr-x 2 root root 4096 6月 26 16:43 data d…

【网络】Linux 内核优化实战 - net.ipv4.ip_local_reserved_ports

目录一、参数作用二、默认值与格式三、典型应用场景四、配置方法五、注意事项六、查看当前配置在Linux系统的TCP/IP网络配置中&#xff0c;net.ipv4.ip_local_reserved_ports 是一个关键内核参数&#xff0c;用于指定禁止系统自动分配的本地端口范围。这些端口会被“预留”出来…

期待在 VR 森林体验模拟中实现与森林的 “虚拟复现”​

VR 森林体验模拟&#xff0c;无疑是科技与自然领域一次极具开创性意义的奇妙碰撞。它借助前沿的虚拟现实技术&#xff0c;以别出心裁、独树一帜的方式&#xff0c;为我们精心打造并带来了一场前所未有的森林探索奇幻之旅 。​在教育领域&#xff0c;于中小学的自然科学课堂上&a…

Qt:QLabel、LCD Number、QProgressBar、QCalendarWidget

目录 一、QLabel 1.属性 2.设置文本格式 3.设置图片 4.设置文本对齐方式 5.设置自动换行 6.设置缩进 7.设置边距 8.设置伙伴关系 二、LCD Number 1.属性 2.Qt仅允许主线程修改界面 三、QProgressBar 属性 四、QCalendarWidget 属性 一、QLabel 同样的&#x…

打造可靠的云基础架构:Azure 区域与可用性区域

随着企业业务的全球化扩展和数字化转型&#xff0c;可靠性已成为企业在选择云平台时的重要考量因素。Azure 作为全球领先的云计算服务提供商&#xff0c;通过区域&#xff08;Regions&#xff09;和可用性区域&#xff08;Availability Zones&#xff09;为企业构建高可用性、高…

订单初版—1.分布式订单系统的简要设计文档

大纲1.订单系统核心业务流程2.Spring Cloud Alibaba在订单业务中的落地方案3.面向分布式全链路故障设计的高可靠架构方案4.分布式订单系统的技术栈与代码规范1.订单系统核心业务流程(1)生成订单时序图(2)支付订单流程图(3)取消订单流程图这里主要介绍生单和退款两个核心链路&am…

【HarmonyOS】富文本编辑器RichEditor详解

【HarmonyOS】富文本编辑器RichEditor详解 一、前言 在信息化高速发展的今天&#xff0c;普通的文本容器&#xff0c;已经不能够承载用户丰富的表达欲。富文本展示已经是移动开发中&#xff0c;必备要解决的问题&#xff0c;在鸿蒙中&#xff0c;通过在系统层提供RichEditor控件…

【MySQL进阶】在一台机器上运行多个MySQL实例

目录 1.使用MySQL Installer安装MySQL实例 1.1.去官网下载MySQL Installer 1.2.停止mysql服务 1.3.为不同的版本指定不同的安装目录 2.配置不同版本的选项文件 2.1.修改数据目录 2.2.修改基本目录 2.3.修改端口号 2.4.设置⽇志⽬录 2.5.配置临时目录 2.6.修改绑定地…

verilog中timescale指令的使用

1.timescale指令格式timescale <时间单位> / <时间精度>时间单位&#xff1a;它确定了仿真中时间值的基本单位。比如 1ns 就意味着时间值是以纳秒为单位来计量的。 时间精度&#xff1a;该参数决定了时间值能够表示的最小分辨率。例如 1ps 表示时间可以精确到皮秒级…

08_Excel 导入 - 用户信息批量导入

08_Excel 导入 - 用户信息批量导入 1. VO 类 java复制编辑Data AllArgsConstructor NoArgsConstructor public class UserInfoBatch4ExcelReq {ExcelProperty(value "用户姓名")Schema(description "用户姓名")private String userName;ExcelProperty(va…

【深度学习新浪潮】什么是世界模型?

世界模型(World Model)是人工智能领域中一类通过构建环境的抽象表示来理解和预测外部世界的系统。它通过整合多模态数据(如视觉、语言、传感器信号)形成对环境的动态认知,并支持智能体在复杂场景中进行决策与规划。以下从核心概念、解决的问题、关键研究、技术路线、现状与…