当前位置: 首页 > news >正文

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万每秒
在这里插入图片描述

相关文章:

C++ 日志库 log4cpp 编译、压测及其范例代码 [全流程手工实践]

文章目录 一、 log4cpp官网二、下载三、编译1.目录结构如下2.configure 编译3.cmake 编译 四、测试五、压测源码及结果1.运行环境信息2.压测源码3.压测结果 文章内容&#xff1a;包含了对其linux上的完整使用流程&#xff0c;下载、编译、安装、测试用例尝试、以及一份自己写好…...

python数据处理与分析入门-pandas使用(4)

往期文章&#xff1a; pandas使用1pandas使用2pandas使用3 pandas使用技巧 创建一个DF对象 # 首先创建一个时间序列 dates pd.date_range(20180101, periods6) print(dates)# 创建DataFrame对象&#xff0c;指定index和columns标签 df pd.DataFrame(np.random.randn(6,4), …...

操作系统-单片机进程状态问题(三态模型问题)

例题&#xff1a;在单处理机计算机系统中有1台打印机、1台扫描仪&#xff0c;系统采用先来先服务调度算法。假设系统中有进程P1、P2、P3、P4&#xff0c;其中P1为运行状态&#xff0c;P2为就绪状态&#xff0c;P3等待打印机&#xff0c;P4等待扫描仪。此时&#xff0c;若P1释放…...

Linux文件:重定向底层实现原理(输入重定向、输出重定向、追加重定向)

Linux文件&#xff1a;重定向底层实现原理&#xff08;输入重定向、输出重定向、追加重定向&#xff09; 前言一、文件描述符fd的分配规则二、输出重定向&#xff08;>&#xff09;三、输出重定向底层实现原理四、追加重定向&#xff08;>>&#xff09;五、输入重定向…...

波搜索算法(WSA)-2024年SCI新算法-公式原理详解与性能测评 Matlab代码免费获取

​ 声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、初始化阶段 二、全…...

洛谷P1364 医院设置

P1364 医院设置 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定&#xff0c…...

哈希表的理解和实现

目录 1. 哈希的概念 (是什么) 2. 实现哈希的两种方式 (哈希函数) 2.1. 直接定址法 2.2. 除留余数法 2.2.1. 哈希冲突 3. 补充知识 3.1. 负载因子 3.2. 线性探测和二次探测 4. 闭散列实现哈希表 (开放定址法) 4.1. 开放定址法的实现框架 4.2. Xq::hash_table::insert…...

分治算法(Divide-and-Conquer Algorithm)

分治算法&#xff08;Divide-and-Conquer Algorithm&#xff09;是一种重要的计算机科学和数学领域的通用问题解决策略。其基本思想是将一个复杂的大规模问题分割成若干个规模较小、结构与原问题相似但相对简单的子问题来处理。这些子问题相互独立&#xff0c;分别求解后再通过…...

Java项目:基于ssm框架实现的实验室耗材管理系统(B/S架构+源码+数据库+毕业论文+答辩PPT)

一、项目简介 本项目是一套基于ssm框架实现的实验室耗材管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 二、技术实现 jdk版本&#xff1a;1.8 …...

如何通过专业的二手机店erp优化手机商家运营!

在数字化浪潮席卷全球的大背景下&#xff0c;手机行业作为科技发展的前沿阵地&#xff0c;正经历着前所未有的变革。对于众多手机商家而言&#xff0c;如何在这场变革中抢占先机&#xff0c;实现数字化转型&#xff0c;成为了摆在他们面前的一大难题。幸运的是&#xff0c;途渡…...

CentOS常见的命令及其高质量应用

CentOS是一个流行的、基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的开源服务器操作系统。由于其稳定性和强大的性能&#xff0c;CentOS被广泛应用于各种服务器环境中。为了有效地管理和维护CentOS系统&#xff0c;熟悉并掌握其常见命令是非常重要的。本文将介绍…...

nodeJs用ffmpeg直播推流到rtmp服务器上

总结 最近在写直播项目 目前比较重要的点就是推拉流 自己也去了解了一下 ffmpeg FFmpeg 是一个开源项目&#xff0c;它提供了一个跨平台的命令行工具&#xff0c;以及一系列用于处理音频和视频数据的库。FFmpeg 能够执行多种任务&#xff0c;包括解封装、转封装、视频和音频…...

Django信号与扩展:深入理解与实践

title: Django信号与扩展&#xff1a;深入理解与实践 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 后端开发 tags: Django信号松耦合观察者扩展安全性能 第一部分&#xff1a;Django信号基础 Django信号概述 一. Django信号的定义与作用 Django信…...

使用Docker创建verdaccio私服

verdaccio官网 1.Docker安装 这边以Ubuntu安装为例Ubuntu 安装Docker​&#xff0c;具体安装方式请根据自己电脑自行搜索。 2.下载verdaccio docker pull verdaccio/verdaccio3.运行verdaccio 运行容器&#xff1a; docker run -it -d --name verdaccio -p 4873:4873 ver…...

Spring 使用 Groovy 实现动态server

本人在项目中遇到这么个需求,有一个模块的server方法需要频繁修改 经阅读可以使用 Groovy 使用java脚本来时pom坐标 <dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy</artifactId><version>3.0.9</version>…...

oracle不得不知道的sql

一、oracle 查询语句 1.translate select translate(abc你好cdefgdc,abcdefg,1234567)from dual; select translate(abc你好cdefgdc,abcdefg,)from dual;--如果替换字符整个为空字符 &#xff0c;则直接返回null select translate(abc你好cdefgdc,abcdefg,122)from dual; sel…...

算法-卡尔曼滤波之卡尔曼滤波的第二个方程:预测方程(状态外推方程)

在上一节中&#xff0c;使用了静态模型&#xff0c;我们推导出了卡尔曼滤波的状态更新方程&#xff0c;但是在实际情况下&#xff0c;系统都是动态&#xff0c;预测阶段&#xff0c;前后时刻的状态是改变的&#xff0c;此时我们引入预测方程&#xff0c;也叫状态外推方程&#…...

刘邦的创业团队是沛县人,朱元璋的则是凤阳;要创业,一个县人才就够了

当人们回顾刘邦和朱元璋的创业经历时&#xff0c;总是会感慨他们起于微末&#xff0c;都创下了偌大王朝&#xff0c;成就无上荣誉。 尤其是我们查阅史书时&#xff0c;发现这二人的崛起班底都是各自的家乡人&#xff0c;例如刘邦的班底就是沛县人&#xff0c;朱元璋的班底是凤…...

【Unity之FairyGUI】你了解FGUI吗,跨平台多功能高效UI插件

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…...

基于51单片机的自动浇花器电路

一、系统概述 自动浇水灌溉系统设计方案&#xff0c;以AT89C51单片机为控制核心&#xff0c;采用模块化的设计方法。 组成部分为&#xff1a;5V供电模块、土壤湿度传感器模块、ADC0832模数转换模块、水泵控制模块、按键输入模块、LCD显示模块和声光报警模块&#xff0c;结构如…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...