C++ 日志庫 log4cpp 編譯、壓測及其范例代碼 [全流程手工實踐]

文章目錄

    • 一、 log4cpp官網
    • 二、下載
    • 三、編譯
      • 1.目錄結構如下
      • 2.configure 編譯
      • 3.cmake 編譯
    • 四、測試
    • 五、壓測源碼及結果
      • 1.運行環境信息
      • 2.壓測源碼
      • 3.壓測結果

文章內容:包含了對其linux上的完整使用流程,下載、編譯、安裝、測試用例嘗試、以及一份自己寫好的壓測用例供大家參考。

關于壓測:壓測代碼和結果見文章末尾,能證明的是多線程的開銷影響很大的。


一、 log4cpp官網

https://log4cpp.sourceforge.net/


二、下載

1.1.4版本下載地址
https://cytranet.dl.sourceforge.net/project/log4cpp/log4cpp-1.1.x%20%28new%29/log4cpp-1.1/log4cpp-1.1.4.tar.gz?viasf=1


三、編譯

1.目錄結構如下

[jn@jn log4cpp]$ tar -xvf log4cpp-1.1.4.tar.gz; cd log4cpp
[jn@jn log4cpp]$ ls
aclocal.m4  bcb5            config         configure     doc      jamfile     log4cpp.cfg        log4cpp.m4     log4cpp.spec     Makefile     msvc10  NEWS     src     TODO
AUTHORS     ChangeLog       config.log     configure.in  include  liblog4cpp  log4cpp-config     log4cpp.pc     log4cpp.spec.in  Makefile.am  msvc6   openvms  tests
autogen.sh  CMakeLists.txt  config.status  COPYING       INSTALL  libtool     log4cpp-config.in  log4cpp.pc.in  m4               Makefile.in  msvc7   README   THANKS
[jn@jn log4cpp]$

2.configure 編譯

configure編譯默認 動態庫 和 靜態庫 都會編譯

tar -xvf log4cpp-1.1.4.tar.gz; cd log4cpp
./configure --prefix=$PWD/liblog4cpp
make install
ls liblog4cpp/

3.cmake 編譯

cmake 編譯需要先運行 ./configure 生成 config.h,另外 cmake 編譯默認只編譯靜態庫(即-DBUILD_SHARED_LIBS=OFF),動態庫需要打開-DBUILD_SHARED_LIBS=ON選項,同時支支持編譯一種

./configure
tar -xvf log4cpp-1.1.4.tar.gz; cd log4cpp
mkdir build;cd build
cmake -DCMAKE_INSTALL_PREFIX=$PWD/liblog4cpp -DBUILD_SHARED_LIBS=ON  ..
make
make install
ls liblog4cpp

四、測試

源碼目錄下的tests目錄有基本上所有示例代碼,如testRollingFileAppender.cpp回滾寫日志文件

編譯方式也很簡單:

  • testRollingFileAppender.cpp
g++ testRollingFileAppender.cpp -I../include -L../lib -l:liblog4cpp.a
  • testPattern.cpp
[jn@jn tests]$ g++ testPattern.cpp -I../include -L../lib -l:liblog4cpp.a
[jn@jn tests]$ ./a.out
% 0 cat1:2024-05-11 00:42:03,855 (1715359323 / 0) [ERROR] ndc1 message % (1534)
>   message<
>message   <
>messa<
>messa<
>c3.c4<
11 May 2024 00:42:03.855 message
11 May 2024 00:42:03.8552024-05-11 00:42:03,855
message 2024-05-11 00:42:03,855
0 message 2024-05-11 00:42:03,855
1 message 2024-05-11 00:42:03,855
2 message 2024-05-11 00:42:03,855
3 message 2024-05-11 00:42:03,855
4 message 2024-05-11 00:42:03,855
5 message 2024-05-11 00:42:03,855
6 message 2024-05-11 00:42:03,855
7 message 2024-05-11 00:42:03,855
8 message 2024-05-11 00:42:03,855
9 message 2024-05-11 00:42:03,855
message 00:42:03.855 11 May 2024
0 message 00:42:03.855 11 May 2024
1 message 00:42:03.855 11 May 2024
2 message 00:42:03.855 11 May 2024
3 message 00:42:03.855 11 May 2024
4 message 00:42:03.855 11 May 2024
5 message 00:42:03.855 11 May 2024
6 message 00:42:03.855 11 May 2024
7 message 00:42:03.855 11 May 2024
8 message 00:42:03.855 11 May 2024
9 message 00:42:03.855 11 May 2024
message[jn@jn tests]$
  • 其他測試,同上
[jn@jn liblog4cpp]$ ls tests/
Clock.cpp  log4cpp.init         Makefile.am  testbench.cpp                            testConfig.log4cpp.properties     testFilter.cpp                testNDC.cpp         testPropConfig.cpp
Clock.hh   log4cpp.nt.property  Makefile.in  testbench.o                              test_convenience.cpp              testFixedContextCategory.cpp  testNDCMain.cpp     testProperties.cpp
Clock.o    log4cpp.properties   NDCTest.hh   testCategory.cpp                         testDailyRollingFileAppender.cpp  testmain                      testNTEventLog.cpp  testProperties.properties
jamfile    log4cpp.property     nesteddir    testConfig.cpp                           testDLL.cpp                       testmain.cpp                  testPattern.cpp     testPropertyConfig.cpp
jn_test    Makefile             testbench    testConfig.log4cpp.dailyroll.properties  testErrorCollision.cpp            testmain.o                    testPriority.cpp    testRollingFileAppender.cpp
[jn@jn liblog4cpp]$

五、壓測源碼及結果

1.運行環境信息

環境:虛擬機VMware
系統:Ubuntu 22.04.1-Desktop
內存:分配16G ------------------ [主機內存:48G]
CPU:分配16核 ----------------- [主機處理器:Intel? Core? i7-14700KF]
磁盤:300G ---------------------- [主機磁盤:7000MHz 固態]

2.壓測源碼

#include <log4cpp/Category.hh>
#include <log4cpp/Appender.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/NDC.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/BasicConfigurator.hh>
#include <log4cpp/RollingFileAppender.hh>
#include <iostream>#include <unistd.h>
#include <thread>#define CPP4LOG_CATEGORY "jnServer"class log4cppHelper
{
public:~log4cppHelper()try {	log4cpp::Category::shutdown();std::cerr << "log4cpp destory!!!"  << std::endl;} catch(log4cpp::ConfigureFailure& f) {std::cerr << "configure failure: " << f.what() << std::endl;}	// don't catch error,let it done by exception or any if;void init(log4cpp::Priority::PriorityLevel logLevel = log4cpp::Priority::DEBUG) {// create layout patternlog4cpp::PatternLayout* layout = new log4cpp::PatternLayout();layout->setConversionPattern("%d{%Y-%m-%d %H:%M:%S,%l} [%p]%m%n"); // create Appender and add layoutlog4cpp::RollingFileAppender *fileAppender = new log4cpp::RollingFileAppender(CPP4LOG_CATEGORY, CPP4LOG_CATEGORY".log");fileAppender->setMaximumFileSize( 50*1024*1024 /*byte*/ );fileAppender->setMaxBackupIndex( 50 );fileAppender->setLayout(layout);// add appender to rootlog4cpp::Category::getRoot().addAppender(fileAppender);// set log levellog4cpp::Category& cat = log4cpp::Category::getInstance(CPP4LOG_CATEGORY);cat.setPriority(logLevel);log4cpp::NDC::push("ndc1");}
};#define EXPAND(x) x
#define IS_EMPTY(...) EXPAND(IS_EMPTY_(__VA_ARGS__, 0, 1))
#define IS_EMPTY_(a, b, ...) b#define LOG_I(fmt, ...) \do { \if (IS_EMPTY(__VA_ARGS__)) { \log4cpp::Category::getInstance(CPP4LOG_CATEGORY).info("[%s:%s:%d] %s " fmt, __FILE__, __func__, __LINE__, ##__VA_ARGS__); \} else { \log4cpp::Category::getInstance(CPP4LOG_CATEGORY).info("[%s:%s:%d] %s", __FILE__, __func__, __LINE__, fmt); \} \} while (0)void log_thread_func(int n) {for (int i = 0; i < n; ++i) {LOG_I("this message is from LOG_DEBUG, and is native log4cpp API for output to file.");LOG_I("this message is from LOG_DEBUG, and is native log4cpp API for output to file.%s.", "end bus");//LOG_I("message");}
}int main(int argc, char* argv[])
{log4cppHelper log;log.init();// threads testconstexpr int NUM_THREADS = 10;constexpr int NUM_Line_Per_thread = 3000000/NUM_THREADS;std::vector<std::thread> threads;for (int i = 0; i < NUM_THREADS; ++i) {threads.emplace_back(log_thread_func, NUM_Line_Per_thread);}for (auto& thread : threads) {thread.join();}return 0;
}

3.壓測結果

①大日志多線程7萬每秒
在這里插入圖片描述

②大日志單線程30萬每秒

在這里插入圖片描述

③小日志單線程固態57萬每秒
在這里插入圖片描述

④小日志多線程18萬每秒
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12885.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12885.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12885.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt | QTimer 類(計時器)

01、相關知識回顧 Qt C++ | QTimer經驗總結Qt | QDateTimeEdit、QDateEdit類和QTimeEdit類02、QTimer 類 1、QTimer 類是 QObejct 的直接子類,該類用于實現計時器,QTimer 類未繼承自 QW

IT革新狂潮:引領未來的技術趨勢

方向一&#xff1a;技術革新與行業應用 當前現狀&#xff1a; 量子計算&#xff1a;量子計算的研究正在加速&#xff0c;盡管目前仍處于初級階段&#xff0c;但其在藥物研發、加密技術和材料科學等領域的應用潛力已被廣泛認可。 虛擬現實&#xff08;VR&#xff09;與增強現實…

湖南大學OS-2018期末考試(不含解析)

前言 不知道哪里翻出來的一張&#xff0c;看著確實像期末考卷&#xff0c;暫且放一下。或許做過&#xff0c;或許沒做過。 總之答案不記得了。做完可以評論區發一下或者找我發出來。 共6道大題。 一、(30%) 1. &#xff08;6%&#xff09; 進程間通信的兩種方法分別是什么&…

完成所有任務的最少時間 - (LeetCode)

前言 今天也是很無精打采的一天&#xff0c;早上看到這道題&#xff0c;都有點懵逼&#xff0c;開始也不懂如何入手&#xff0c;既然自己搞不定&#xff0c;就順便測試了一下AI吧&#xff0c;測試了通義千問和文心一言&#xff0c;把題目拿去那里問&#xff0c;可以把解題思路…

DRF 跨域問題

【一】說明 CORS&#xff08;跨來源資源共享&#xff0c;Cross-Origin Resource Sharing&#xff09;是一種瀏覽器技術的規范&#xff0c;旨在解決瀏覽器同源策略&#xff08;Same-Origin Policy&#xff09;的限制&#xff0c;使得Web服務可以從不同的網域&#xff08;源&…

error Error: certificate has expired

用yarn命令安裝依賴的時候遇到報錯&#xff1a; 原因&#xff1a;可能是開了服務器代理訪問導致ssl安全證書失效 解決方法&#xff1a; 在終端輸入 yarn config set "strict-ssl" false -g yarn config set "strict-ssl" false -g 然后再安裝依賴就不…

RS2227XN功能和參數介紹及PDF資料

RS2227XN是一款模擬開關/多路復用器 品牌: RUNIC(潤石) 封裝: MSOP-10 描述: USB2.0高速模擬開關 開關電路: 雙刀雙擲(DPDT) 通道數: 2 工作電壓: 1.8V~5.5V 導通電阻(RonVCC): 10Ω 功能&#xff1a;模擬開關/多路復用器 USB2.0高速模擬開關 工作電壓范圍&#xff1a;1.8V ~ 5…

Linux運行級別介紹

unlevel 運行級別 cat /etc/inittab 0 - halt (Do NOT set initdefault to this) --關機 1 - Single user mode --單用戶(進入單用戶不需要帳號與密碼) 2 - Multiuser, without NFS (The same as 3, if you do not have networking) 多用戶&#xff08;沒有網絡&#xff09; 3…

Java基礎篇常見面試問題總結

文章目錄 1. 你是怎樣理解 OOP面向對象?2. 重載與重寫區別3. 接口與抽象類的區別4. 深拷貝與淺拷貝的理解5. 什么是自動拆裝箱&#xff1f; int和 Integer有什么區別6. 和 equals()區別7. String類 能被繼承嗎為什么用 final修飾8. final、finally、finalize區別 1. 你是怎樣理…

【C語言】6.C語言VS實用調試技巧(1)

文章目錄 1.什么是 bug2.什么是調試&#xff08;debug&#xff09;&#xff1f;3.Debug 和 Release4.VS調試快捷鍵4.1 環境準備4.2 調試快捷鍵 5.監視和內存觀察5.1 監視5.2 內存 1.什么是 bug bug現在一般是指在電腦系統或程序中&#xff0c;隱藏著的一些未被發現的缺陷或問題…

Git使用(3):版本管理

一、查看歷史 編寫一個java類進行測試 選擇Git -> Show Git Log查看日志。 第一次修改推送到遠程倉庫了&#xff0c;所以有origin&#xff08;遠程倉庫地址&#xff09;&#xff0c;第二次修改只提交到本地倉庫所以沒有。 二、版本回退 1、本地回退 在要回退的版本上右鍵&a…

XLSX文件刪除了怎么找回?8個恢復方法,太實用了!

U盤作為一種便攜的存儲設備&#xff0c;隨之而來的數據丟失問題也讓人頭疼。尤其是當U盤中的XLSX文件&#xff08;Excel 2007及以后版本的默認文件格式&#xff09;被誤刪除或丟失時&#xff0c;如何高效找回這些數據成為了許多人關注的焦點。 本文將從XLSX文件的特性、U盤格式…

C++set關聯式容器

Cset 1. 關聯式容器 vector、list、deque、forward_list(C11)等STL容器&#xff0c;其底層為線性序列的數據結構&#xff0c;里面存儲的是元素本身&#xff0c;這樣的容器被統稱為序列式容器。而map、set是一種關聯式容器&#xff0c;關聯式容器也是用來存儲數據的&#xff0…

深度盤點在當今經濟形勢下資深項目經理或PMO的或去或從

在當今經濟形勢下&#xff0c;資深項目經理&#xff08;Project Manager&#xff09;或項目管理辦公室&#xff08;PMO&#xff09;的去向和選擇受到多種因素的影響。以下是對他們可能面臨的或去或從的深度盤點&#xff1a; 1、發展去向 1. 深化專業領域&#xff1a;在經濟形勢…

Linux程序開發(一):Linux基礎入門安裝和實操手冊

Tips&#xff1a;"分享是快樂的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不僅有知識的海洋&#x1f30a;&#xff0c;還有滿滿的正能量加持&#x1f4aa;&#xff0c;快來和我一起分享這份快樂吧&#x1f60a;&#xff01; 喜歡我的博客的話&#xff0c;記得…

CSAP_MAT_BOM_MAINTAIN 返回消息處理

CSAP_MAT_BOM_MAINTAIN是創建修改BOM的函數&#xff0c;但這個函數的返回參數中沒有消息返回。 需要在調用前使用函數&#xff1a; CALL FUNCTION CALO_INIT_APIEXPORTINGdata_reset_sign EXCEPTIONSlog_object_not_found 1log_sub_object_not_found 2other_e…

QT筆記 - QPainter 填充環形區域(甜甜圈)

以矩形為例&#xff1a; QPainter painter(this);// painter.setPen(Qt::blue);// painter.setFont(QFont("Arial",30));// painter.drawText(rect(),Qt::AlignCenter,"Hello Qt!!!");QRect rect QRect(50, 50, 400, 400);QRect box QRect(100, 100, 105…

TS-抽象類和靜態成員

目錄 1&#xff0c;抽象類1&#xff0c;為什么需要抽象類2&#xff0c;抽象成員3&#xff0c;設計模式-模板模式 2&#xff0c;靜態成員1&#xff0c;什么是靜態成員2&#xff0c;設計模式-單例模式 1&#xff0c;抽象類 1&#xff0c;為什么需要抽象類 有時&#xff0c;某個…

Java面試八股之Java中有哪些原子類,原理是什么

Java中有哪些原子類&#xff0c;原理是什么 AtomicInteger 和 AtomicLong&#xff1a; 用于對整數&#xff08;int&#xff09;和長整數&#xff08;long&#xff09;進行原子操作。 原理&#xff1a;它們內部封裝了一個整型或長整型變量&#xff0c;并通過使用Unsafe類提供…

HarmonyOS - 記一次HSP異常堆棧無法定位問題

問題背景 HSP混淆打包之后無法定位異常堆棧&#xff0c;問題堆棧為&#xff1a; MyModules/build/default/cache/default/defaultCompileArkTS/esmodule/release/MyModules/src/main/ets/d/r.ts:1:1 問題原因&#xff1a; 導致無法定位問題的原因是&#xff0c;混淆時開啟了代碼…