我个人的log4cplus-1.2.1的编译与测试使用,CentOS环境

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 我个人的log4cplus-1.2.1的编译与测试使用,CentOS环境

https://sourceforge.net/projects/log4cplus/

https://sourceforge.net/p/log4cplus/wiki/Home/

http://log4cplus.sourceforge.net/docs/html/index.html

https://github.com/log4cplus/log4cplus


说起日志系统,不得不提大名鼎鼎的Log4j。特别是使用Java的人们,能够说是无人不知无人不晓无人不用。

Log4j以其简单的使用方式(引入一个jar包。一行代码就可以调用)。灵活(可通过配置文件任意配置),功能强大(多个级别。可配置多个输出目的地,Console,File。系统日志。远端的LogServer等等,可订制日志格式,自己主动产生,删除日志文件)等等等等特性,一直是Java日志系统的首选。

Log4cplus简介:

log4cplus是C++编写的开源的日志系统,前身是java编写的log4j系统,受Apache Software License保护,作者是Tad

E. Smith。log4cplus具有线程安全、灵活、以及多粒度控制的特点,通过将日志划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期。你可以选择将日志输出到屏幕、文件、NT event log、甚至是远程服务器;通过指定策略对日志进行定期备份等等。

选型比较:

log4cxx:Apache的产品,属于apache的子项目之一,由log4j移植过来的。移植过来的东西多数都有一个特点,那就是要依赖各种碗糕。log4cxx就需要依赖apr-utils,编译起来没那么直接,因此我放弃了它。而且这个库最新版本是0.10.0,最近几年都不怎么更新了。

log4cpp:感觉上log4cpp和log4cplus大同小异,支持的功能也类似。上上一次更新是在2007年,不过在时隔五年之后的去年年底(2012年),它突然又更新了, 从1.0版提升到了1.1版,有点不容易,感觉诈尸了。另外,它也是由log4j移植过来的。

log4cplus:log4cplus究竟和log4cpp区别在哪,如果一定要作对比似乎log4cplus比log4cpp复杂了那么一点点。log4cplus的功能比log4cpp支持的功能更加全面,支持线程安全(log4cpp的代码里也做了一些对线程安全的保证,但官方没有介绍它支持线程安全,但是我自己在centos 6.2上面编译log4cpp后发现其不支持多线程,详情:http://sourceforge.net/p/log4cpp/feature-requests/34/。反而log4cplus宣称自己是线程安全的),另外log4cplus更新非常频繁,对于一个有版本洁癖的人来说,这也是我选择它的原因,新版本提供了vc10的解决方案,还支持可选编译Unicode和非Unicode版本。

glog:这个就不介绍了,全称Google Glog, Google的东西一直比较让人放心。它比log4系列的库都要简单,不过它不支持用配置文件控制日志行为,这对我来说是个遗憾。

zlog: 使用C编写,支持window和linux,但是Linux下有些问题,所以放弃了。

log4系列的库前身都是log4j,log4j真是深藏功与名。以下通过log4plus来介绍一下它的基本用法和魅力。


总之,折腾了log4cplus,log4cxx,log4cpp,最终选择log4cplus。

log4cplus: 简洁, 下载的包编译顺利, 测试例子也能顺利运行。log4cplus是log4j的c++移植版,是c++中一个很好的打印日志的库。它与另外一个c++的log库log4cxx相比较,好处是不依赖于libapr和libaprutil,可以静态链接到程序中,便于部署。

log4cxx: 臃肿, 需要引用apr(Apache Portable Runtime), 最痛苦的是老是编译不了。


log4cpp: 落后, 最后更新于2007年,而且下载的包不完整。



一、安装


环境是CentOS 7.3,gcc 4.8.5


tar xvzf log4cplus-1.2.1.tar.gz

cd log4cplus-1.2.1

./configure --prefix=/where/to/install

make

make install


这里我采用缺省安装路径:


库文件在/usr/local/lib


头文件在/usr/local/include/log4cplus



在编译log4cplus的,configure默认不生成静态库文件,如果需要修改log4cplus中的代码,而目前项目已经大面积使用了log4cplus,并且是动态加载log4cplus.so文件的,覆盖log4cplus.so*文件就会导致现在已经启动的进程异常中止,所以如果有需要修改源码的项目,建议静态加载。


生成静态库的方法为:./configure --enable-static


编译成功之后,生成的库文件位置为.libs目录。


查看log4cplus 的configure命令为./configure -h


静态加载时注意事项:在Makefile 记得加上-lrt选项,不然make会出错。



二、实例,完整工程下载:http://download.csdn.net/download/libaineu2004/10256030



代码:


#include <cstdlib>

#include <log4cplus/logger.h>

#include <log4cplus/configurator.h>

#include <log4cplus/helpers/loglog.h>

#include <log4cplus/helpers/stringhelper.h>

#include <log4cplus/loggingmacros.h>

#include <iomanip> //std::setprecision

using namespace std;

using namespace log4cplus;

using namespace log4cplus::helpers;

int main()

{

   log4cplus::initialize();

   //log4cplus.rootLogger//

   PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log.properties"));

   Logger logger = Logger::getRoot();

   // trace

   LOG4CPLUS_TRACE(logger, "trace and get the fingerprint: " << "random integer: " << random());

   // debug

   LOG4CPLUS_DEBUG(logger, "this is debug log: " << "random integer: "<< random());

   // info

   LOG4CPLUS_INFO(logger, "the information centry...." << "[ 1 + 1 = " << 1 + 1 << "]");

   // warn

   int i = 10;

   LOG4CPLUS_WARN(logger, "Writing warning messages to log...." << i);

   // error

   LOG4CPLUS_ERROR(logger, "ooooooh, there is an error....");

   //fatal

   LOG4CPLUS_FATAL(logger, "oh, my god! the fatal error occur!!!!!!!!!");

   LOG4CPLUS_DEBUG(logger, "This is a bool: " << true);

   LOG4CPLUS_INFO(logger, "This is a char: " << 'x');

   LOG4CPLUS_WARN(logger, "This is a int: " << 1000);

   LOG4CPLUS_ERROR(logger, "This is a long(hex): " << std::hex << 100000000);

   LOG4CPLUS_FATAL(logger, "This is a double: " << std::setprecision(15) << 1.2345234234);

   //log4cplus.logger.test//

   Logger loggerTest  = log4cplus::Logger::getInstance("test");

   LOG4CPLUS_TRACE(loggerTest,"anther logger,trace");

   LOG4CPLUS_ERROR(loggerTest,"anther logger,error ");

   log4cplus::Logger::shutdown();

   return 0;

}


log.properties



log4cplus.rootLogger=ERROR, R

log4cplus.appender.R=log4cplus::ConsoleAppender

log4cplus.appender.R.File=./log/error.log

log4cplus.appender.R.MaxFileSize=500KB  

log4cplus.appender.R.MaxBackupIndex=5

log4cplus.appender.R.Schedule=HOURLY

log4cplus.appender.R.Append=true

log4cplus.appender.R.layout=log4cplus::PatternLayout

log4cplus.appender.R.layout.ConversionPattern=[%D{%Y-%m-%d %H:%M:%S,%Q}] [%t] %-5p - %m%n[%p]

log4cplus.logger.test=TRACE, RR

log4cplus.appender.RR=log4cplus::DailyRollingFileAppender

log4cplus.appender.RR.File=./log/test.log

log4cplus.appender.RR.MaxFileSize=500KB

log4cplus.appender.RR.MaxBackupIndex=192 #8 * 24

log4cplus.appender.RR.Schedule=HOURLY

log4cplus.appender.RR.Append=true

log4cplus.appender.RR.layout=log4cplus::PatternLayout

log4cplus.appender.RR.layout.ConversionPattern=%p %D{%Y-%m-%d %H:%M:%S.%q}:%t %F:%L "%m"%n

CMakeLists.txt


cmake_minimum_required(VERSION 2.8)

project(mylog4cplusTest)

find_library(LOG4CPLUS_LIB liblog4cplus.so /usr/local/lib/)

IF (NOT LOG4CPLUS_LIB)

   MESSAGE(FATAL_ERROR "log4cplus not found")

ENDIF(NOT LOG4CPLUS_LIB)

add_executable(${PROJECT_NAME} "main.cpp" )

TARGET_LINK_LIBRARIES(${PROJECT_NAME} log4cplus)


编译通过,但是运行时会报错:error while loading shared libraries: liblog4cplus.so: cannot open shared object file: No such file or directory

此时需要在/etc/ld.so.conf中加入liblog4cplus.so所在的目录:/usr/local/lib/

然后在终端执行命令,使之生效:

[root@localhost etc]# ldconfig

注意,/usr/local/lib/每次有库文件更新,都需要终端重新运行一次ldconfig这条命令。





三、说明


log4cplus提供一个类【PropertyConfigurator】来实现从文件读取配置,参数就是文件名。其他参数采用默认。

配置文件内容如下:

1.  选择logger

Logger logger = Logger::getRoot(); 这个用来选择rootLogger的其他的还可以配置更多的logger,Logger logger = log4cplus::Logger::getInstance("test");一般情况下不是很需要。


2.  日志输出级别 TRACE

logger名称之后的第一个参数可以控制日志输出,如在debug环境中,输出各种debug信息,而在线上环境中,则只需要输出info和各类错误信息。log4cplus支持如下日志级别,使用方法可以看cpp代码。

•TRACE •DEBUG •INFO •WARN •ERROR •FATAL

上述各种级别中,从上往下,重要性依次递增。而在配置文件中的级别会屏蔽掉比它重要性更低的日志输出。


3.  appender配置

每个logger可以添加appender,在logger后面的第二个参数即为apppender

如这个例子:log4cplus.rootLogger=ERROR, R

名称为R的appender

在appender上可以设置日志输出位置、日志路径、layout等等内容

a.日志文件名

通过配置项:log4cplus.appender.R.File=./log/error.log        


4.  appender输出位置

(1)控制台输出

ConsoleAppender

(2)文件输出

FileAppender / RollingFileAppender / DailyRollingFileAppender .


RollingFileAppender使用MaxFileSize设置一个日志文件的最大大小,当产生多个日志时,会在日志名称后面加上".1"、".2"、……这样的后缀,我们可以看到RollingFileAppender有个属性MaxBackupIndex,这个属性通过限制日志文件名后缀".n"中的n大小来限制日志数量,比如上面MaxBackupIndex=10,其实最大日志数量为11。我们知道这个有这个限制是很必要的,当我们的程序在服务器上运行时,随着时间的迁移,日志会越来越多,如果对日志数量没有限制,日志大小会越来越大,最后甚至占满整个硬盘。

DailyRollingFileAppender特点是固定周期时间生成一个日志文件,比如,默认情况是每天生成一个文件。这种日志可以方便根据时间来定位日志位置,使日志清晰易查。但是这种日志有个不好地方是,不能限制日志数量,MaxBackupIndex属性和MaxFileSize在DailyRollingFileAppender中是无效的,我们上面已经提到限制日志数量的必要性。这里有两个解决办法:

linux上crontab+shell

用户程序里面起一个线程,定期扫描日志文件夹。


更详细的介绍请参见:log4cplus库:将日志写入到文件



5.  layout

layout是控制日志输出格式的

log4cplus.appender.R.layout=log4cplus::PatternLayout

log4cplus.appender.R.layout.ConversionPattern=[%D{%Y-%m-%d%H:%M:%S,%Q}] [%t] %-5p - %m%n

格式包括三种类型:

1.) SimpleLayout 是一种简单格式的布局器,在输出的原始信息之前加上LogLevel和一个"-"。

2.) TTCCLayout 其格式由时间,线程ID,Logger和NDC 组成。

3.) PatternLayout 是一种有词法分析功能的模式布局器,类似正则表达式。以“%”作为开头的特殊预定义标识符,将产生特殊的格式信息。

在PatternLayout格式有以下选项:

(1)"%%",转义为% 。

(2)"%c",输出logger名称,如test.subtest 。也可以控制logger名称的显示层次,比如"%c{1}"时输出"test",其中数字表示层次。

(3)"%D",显示本地时间,比如:"2004-10-16 18:55:45",%d显示标准时间。  

可以通过%d{...}定义更详细的显示格式,比如%d{%H:%M:%s}表示要显示小时:分钟:秒。大括号中可显示的预定义标识符如下:

  %a -- 表示礼拜几,英文缩写形式,比如"Fri"

   %A -- 表示礼拜几,比如"Friday"

   %b -- 表示几月份,英文缩写形式,比如"Oct"

  %B -- 表示几月份,"October"

  %c -- 标准的日期+时间格式,如"Sat Oct 16 18:56:19 2004"

  %d -- 表示今天是这个月的几号(1-31)"16"

  %H -- 表示当前时刻是几时(0-23),如"18"

  %I -- 表示当前时刻是几时(1-12),如"6"

  %j -- 表示今天是哪一天(1-366),如"290"

  %m -- 表示本月是哪一月(1-12),如"10"

  %M -- 表示当前时刻是哪一分钟(0-59),如"59"

  %p -- 表示现在是上午还是下午,AM or PM

  %q -- 表示当前时刻中毫秒部分(0-999),如"237"

  %Q -- 表示当前时刻中带小数的毫秒部分(0-999.999),如 "430.732"

  %S -- 表示当前时刻的多少秒(0-59),如"32"

  %U -- 表示本周是今年的第几个礼拜,以周日为第一天开始计算(0-53),如 "41"

  %w -- 表示礼拜几,(0-6, 礼拜天为0),如"6"

  %W -- 表示本周是今年的第几个礼拜,以周一为第一天开始计算(0-53),如 "41"

  %x -- 标准的日期格式,如"10/16/04"

  %X -- 标准的时间格式,如"19:02:34"

  %y -- 两位数的年份(0-99),如"04"

  %Y -- 四位数的年份,如"2004"

  %Z -- 时区名,比如"GMT"

(4)"%F",输出当前记录器所在的文件名称,比如"main.cpp"

(5)"%L",输出当前记录器所在的文件行号,比如"51"

(6)"%l",输出当前记录器所在的文件名称和行号,比如"main.cpp:51"

(7)"%m",输出原始信息。

(8)"%n",换行符。

(9)"%p",输出LogLevel,比如"DEBUG"

(10)"%t",输出记录器所在的线程ID,比如 "1075298944"

(11)"%x",嵌套诊断上下文NDC (nested diagnostic context) 输出,从堆栈中弹出上下文信息,NDC可以用对不同源的log信息(同时地)交叉输出进行区分。

(12)格式对齐,比如"%-10m"时表示左对齐,宽度是10,当然其它的控制字符也可以相同的方式来使用,比如"%-12d","%-5p"等等。


本例使用:log4cplus.appender.R.layout.ConversionPattern=[%D{%Y-%m-%d%H:%M:%S,%Q}] [%t] %-5p - %m%n


参考文章:http://www.cnblogs.com/james1207/p/3328996.html

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
4月前
|
Linux 编译器 开发工具
在CentOS环境下升级GCC编译器的指南
总结:本文提供了一种方法来升级CentOS的GCC编译器,通过使用CentOS的软件集合和开发者工具集工具,可以比较平滑地进行升级。在整个过程中无需从源代码编译,这样既省去了复杂的编译过程,也避免了可能出现的与系统库不兼容的风险。请注意,使用第三方仓库可能会带来系统稳定性和安全性上的潜在影响。所有操作都应谨慎进行,并确保有相应的数据备份。
689 19
|
4月前
|
机器学习/深度学习 存储 算法
强化学习算法基准测试:6种算法在多智能体环境中的表现实测
本文系统研究了多智能体强化学习的算法性能与评估框架,选用井字棋和连珠四子作为基准环境,对比分析Q-learning、蒙特卡洛、Sarsa等表格方法在对抗场景中的表现。实验表明,表格方法在小规模状态空间(如井字棋)中可有效学习策略,但在大规模状态空间(如连珠四子)中因泛化能力不足而失效,揭示了向函数逼近技术演进的必要性。研究构建了标准化评估流程,明确了不同算法的适用边界,为理解强化学习的可扩展性问题提供了实证支持与理论参考。
238 0
强化学习算法基准测试:6种算法在多智能体环境中的表现实测
|
6月前
|
监控 安全 测试技术
【01】卓伊凡收到冒充税务机关的诈骗程序-决定在沙盒Sandbox环境中运行测试下-广大企业同胞们注意防诈骗
【01】卓伊凡收到冒充税务机关的诈骗程序-决定在沙盒Sandbox环境中运行测试下-广大企业同胞们注意防诈骗
205 14
【01】卓伊凡收到冒充税务机关的诈骗程序-决定在沙盒Sandbox环境中运行测试下-广大企业同胞们注意防诈骗
|
9月前
|
存储 人工智能 编译器
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
573 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
9月前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
1171 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
10月前
|
网络协议 Java 应用服务中间件
centos7环境下tomcat8的安装与配置
本文介绍了在Linux环境下安装和配置Tomcat 8的详细步骤。首先,通过无网络条件下的文件交互软件(如Xftp 6或MobaXterm)下载并解压Tomcat安装包至指定路径,启动Tomcat服务并测试访问。接着,修改Tomcat端口号以避免冲突,并部署Java Web应用项目至Tomcat服务器。最后,调整Linux防火墙规则,确保外部可以正常访问部署的应用。关键步骤包括关闭或配置防火墙、添加必要的端口规则,确保Tomcat服务稳定运行。
|
机器学习/深度学习 人工智能 算法
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
BALROG 是一款用于评估大型语言模型(LLMs)和视觉语言模型(VLMs)在复杂动态环境中推理能力的基准测试工具。它通过一系列挑战性的游戏环境,如 NetHack,测试模型的规划、空间推理和探索能力。BALROG 提供了一个开放且细粒度的评估框架,推动了自主代理研究的进展。
352 3
BALROG:基准测试工具,用于评估 LLMs 和 VLMs 在复杂动态环境中的推理能力
|
缓存 Ubuntu Linux
Linux环境下测试服务器的DDR5内存性能
通过使用 `memtester`和 `sysbench`等工具,可以有效地测试Linux环境下服务器的DDR5内存性能。这些工具不仅可以评估内存的读写速度,还可以检测内存中的潜在问题,帮助确保系统的稳定性和性能。通过合理配置和使用这些工具,系统管理员可以深入了解服务器内存的性能状况,为系统优化提供数据支持。
877 4
|
10月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
5月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
983 23