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
英文地址,請注明出處:http://en.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)是人工智能領域中一類通過構建環境的抽象表示來理解和預測外部世界的系統。它通過整合多模態數據(如視覺、語言、傳感器信號)形成對環境的動態認知,并支持智能體在復雜場景中進行決策與規劃。以下從核心概念、解決的問題、關鍵研究、技術路線、現狀與…