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 pattern
        log4cpp::PatternLayout* layout = new log4cpp::PatternLayout();
        layout->setConversionPattern("%d{%Y-%m-%d %H:%M:%S,%l} [%p]%m%n"); 
        // create Appender and add layout
        log4cpp::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 root
        log4cpp::Category::getRoot().addAppender(fileAppender);

        // set log level
        log4cpp::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 test
    constexpr 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万每秒
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20232906 2023-2024-2 《网络与系统攻防技术》第十次作业

20232906 2023-2024-2 《网络与系统攻防技术》第十次作业 1.实验内容 一、SEED SQL注入攻击与防御实验 我们已经创建了一个Web应用程序&#xff0c;并将其托管在http://www.seedlabsqlinjection.com/&#xff08;仅在SEED Ubuntu中可访问&#xff09;。该Web应用程序是一个简…

Qt多文档程序的一种实现

注&#xff1a;文中所列代码质量不高&#xff0c;但不影响演示我的思路 实现思路说明 实现DemoApplication 相当于MFC中CWinAppEx的派生类&#xff0c;暂时没加什么功能。 DemoApplication.h #pragma once#include <QtWidgets/QApplication>//相当于MFC中CWinAppEx的派生…

【Python报错】Python安装模块时报错Fatal error in launcher

【Python报错】Python安装模块时报错Fatal error in launcher 最近需要用到python下载一个小工具&#xff0c;自信敲下回车键本想看到黑乎乎的终端上会出现快速跳跃的命令代码&#xff0c;没想到&#xff0c;报错了...... Fatal error in launcher: Unable to create process …

外卖系统拦截器实现(Interceptor)

SpringMVC的拦截器主要是用于拦截控制器方法的执行&#xff1b; 概念&#xff1a;是一种动态拦截方法调用的机制&#xff0c;类似于过滤器。在Spring中动态拦截控制器中方法的执行。 作用&#xff1a;在指定的控制器中调用前后执行预先设定的代码&#xff0c;完成功能增强。 应…

day08|字符串题目part01

相关题目&#xff1a; ● 344.反转字符串 ● 541. 反转字符串II ● 卡码网&#xff1a;54.替换数字 ● 151.翻转字符串里的单词 ● 卡码网&#xff1a;55.右旋转字符串 344.反转字符串—双指针的应用 力扣链接 思路&#xff1a;创建两个指针分别指向头部和尾部&#xff0c;首…

【JavaEE进阶】 Bean的作用域与生命周期

文章目录 &#x1f343;Bean的作用域&#x1f6a9;作用域的使用&#x1f6a9;观察Bean的作用域&#x1f388;单例作用域&#x1f388;多例作用域&#x1f388;请求作用域&#x1f388;会话作⽤域&#x1f388;Application作⽤域 &#x1f384;Bean的⽣命周期⭕总结 &#x1f34…

Linux 第三十三章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

rocketmq的存储和检索

messageId是rocketmq自动生成的。

JSP+SQL学生成绩管理系统

Java版本&#xff1a;1.8 数据库&#xff1a;MySQL 框架&#xff1a;Spring Spring MVC MyBatis 服务器&#xff1a;Tomcat 前端解析框架&#xff1a;Thymeleaf 开发工具&#xff1a;Idea 2017 版本管理工具&#xff1a;Maven 版本控制工具&#xff1a;GitHub 经过对系统的需…

国际化日期(inti)

我们可以使用国际化API自动的格式化数字或者日期&#xff0c;并且格式化日期或数字的时候是按照各个国家的习惯来进行格式化的&#xff0c;非常的简单&#xff1b; const now new Date(); labelDate.textContent new Intl.DateTimeFormat(zh-CN).format(now);比如说这是按照…

link.click()时浏览器报错The file at ‘data:image/png;base64,iVBORw

代码如下&#xff1a; const dataURL canvas.toDataURL({format: "png",width: 400,height: 400, });const link document.createElement("a"); link.download new Date().getTime();link.href dataURL; document.body.appendChild(link); link.click…

【考研数学】准备开强化,更「张宇」还是「武忠祥」?

数一125学长前来回答&#xff0c;选择哪位老师的课程&#xff0c;这通常取决于你的个人偏好和学习风格&#xff01; 张宇老师和武忠祥老师都是非常有经验的数学老师&#xff0c;他们的教学方法各有特点。 张宇老师的教学风格通常被认为是通俗易懂&#xff0c;善于将复杂的概念…

x264 帧类型代价计算原理:slicetype_mb_cost 函数分析

slicetype_mb_cost 函数 函数功能 计算每个宏块 MB 的代价 cost。函数参数分析 x264_t *h:全局编码结构体x264_mb_analysis_t *a:宏块分析结构体x264_frame_t **frames:系列帧数据结构体int p0:帧序号之一,一般指向靠前帧int p1:帧序号之一,一般指向靠后帧int b:帧标志…

《系统架构设计师教程(第2版)》第4章-信息安全技术基础知识-02-信息加密技术

文章目录 1. 信息加密技术1.1 数据加密1.2 对称密钥加密算法1&#xff09;数据加密标准&#xff08;DES)2&#xff09;三重DES&#xff08;Triple-DES&#xff09;3&#xff09;国际数据加密算法&#xff08;IDEA&#xff09;4&#xff09;高级加密标准&#xff08;AES&#xf…

【C -> Cpp】由C迈向Cpp (6):静态、友元和内部类

标题&#xff1a;【C -&#xff1e; Cpp】由C迈向Cpp &#xff08;6&#xff09;&#xff1a;静态、友元和内部类 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 &#xff08;一&#xff09;静态成员 &#xff08;二&#xff09;友元 &#xff08;三&#xff09…

Zynq UltraScale+ RFSoC 配置存储器器件

Zynq UltraScale RFSoC 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Zynq UltraScale RFSoC 器件执行擦除、空白检查、编程和验证等配置操 作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 &#xff0c; 并支持通过 Vivado 软件对其中所列…

扭亏为盈的赛力斯,真正进入稳态了吗?

“72小时内大定破1万台”。5月15日&#xff0c;问界新M5开启全国大规模交付&#xff0c;从当前取得的成绩来看&#xff0c;赛力斯的“富贵”似乎还将延续。 其实&#xff0c;此前基于问界新M7等车型的爆火&#xff0c;赛力斯已经找到了创收轨道。财报显示&#xff0c;2024年一…

无代码无国界:我们正在走向软件安全的狂野西部吗?

我们使用的几乎所有东西都是基于代码构建的&#xff0c;从汽车到智能冰箱再到门铃。在企业中&#xff0c;无数的应用程序保持设备、工作流程和操作的运行。因此&#xff0c;当早期的无代码开发平台于 2010 年推出时&#xff0c;承诺为公民开发人员提供更易于访问的应用程序开发…

用友GRP-U8 bx_dj_check.jsp SQL注入漏洞复现(XVE-2024-10537)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

【2024华为HCIP831 | 高级网络工程师之路】刷题日记(18)

个人名片&#xff1a;&#x1faaa; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&a…