文章目錄
- 一、 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萬每秒