log4c
1、理解为啥叫这个名字
从log4j的百度百科中了解到,log4j--log for java(java的日志),因此4代表的是for这个单词。
2、官网
2-1、log4c
(log4c)[http://log4c.sourceforge.net/index.html]
Log4c是一个C库,用于灵活地记录文件、系统日志和其他目的地。它是根据Java库的日志建模的(http://jakarta.apache.org/log4j/),尽可能接近其API。 马克·孟德尔以不同的理念启动了一个平行的log4c项目。该设计是面向宏的,因此更轻、更快,非常适合内核开发。
2-2、Log4cpp
Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。 使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流、内存字符串队列、文件、回滚文件、调试器、Windows日志、syslog和远程syslog服务器中。 Log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致。其类似的支持库还包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(log4p)等。
2-3、log4j
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
2-4、log4cplus
log4cplus是C++编写的开源的日志系统,前身是java编写的log4j系统,受Apache Software License保护,作者是Tad E. Smith。
log4cplus具有线程安全、灵活、以及多粒度控制的特点,通过将日志划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期。你可以选择将日志输出到屏幕、文件、NT event log、甚至是远程服务器;通过指定策略对日志进行定期备份等等。
https://github.com/log4cplus/log4cplus sourceforge.net/projects/log4cplus/
2-5、log4cxx
官网:http://logging.apache.org/log4cxx/index.html
Log4cxx是开放源代码项目ApacheLoggingService的子项目之一,是Java社区著名的log4j的c++移植版,用于为C++程序提供日志功能,以便开发者对目标程序进行调试和审计。
3、Log4cplus使用详解
3-1、安装
tar xvf log4cplus-2.0.7.tar.xz
cd log4cplus-2.0.7/
./configure
make
make install
如果需要指定安装路径可使用--prefix参数, 否则将缺省安装到/usr/local目录下。另外,如果需要单线程版本可通过参数-enable-threads=no指定, 否则默认将安装多线程版本。
对于HP-UNIX平台用户, 由于aCC编译器选项兼容性问题,请另外加入参数CXXFLAGS=”-AA -w”(单线程版本)或CXXFLAGS=”-AA –mt -w”(多线程版本)。
安装成功后将在/usr/local目录或指定的目录下创建include和lib两个子目录及相应文件。其中include目录包含头文件,lib目录包含最终打包生成的静态和动态库。在动态连接log4cplus库时请使用-llog4cplus选项。
3-2、测试
cd tests
mkdir build
cmake ..
make
结果是一些列的报错,编译失败。 先进行自己编写demo测试一下,回头再来看看这个问题。
demo程序没有问题,需要c++11,还是没有编译成功,可能是没有添加-llog4cplus选项(编译成功)。
cmake -DCMAKE_CXX_STANDARD=11 ..
[root@ubuntu0006:/media/hankin/vdb/study/log4cplus/log4cplus-2.0.7/tests/build] #make
Scanning dependencies of target appender_test
[ 3%] Building CXX object appender_test/CMakeFiles/appender_test.dir/main.o
[ 6%] Linking CXX executable appender_test
CMakeFiles/appender_test.dir/main.o:在函数‘printAppenderList(std::vector<log4cplus::helpers::SharedObjectPtr<log4cplus::Appender>, std::allocator<log4cplus::helpers::SharedObjectPtr<log4cplus::Appender> > > const&)’中:
main.cxx:(.text+0x2e):对‘log4cplus::tcout’未定义的引用
main.cxx:(.text+0xcf):对‘log4cplus::tcout’未定义的引用
CMakeFiles/appender_test.dir/main.o:在函数‘main’中:
3-3、基本步骤
使用log4cplus有六个基本步骤:
- 实例化一个封装了输出介质的appender对象;
- 实例化一个封装了输出格式的layout对象;
- 将layout对象绑定(attach)到appender对象;如省略此步骤,简单布局器SimpleLayout(参见5.1小节)对象会绑定到logger。
- 实例化一个封装了日志输出logger对象,并调用其静态函数getInstance()获得实例,log4cplus::Logger::getInstance("logger_name");
- 将appender对象绑定(attach)到logger对象;
- 设置logger的优先级,如省略此步骤,各种有限级的日志都将被输出。
3-4、标准使用
demo见:D:\Github\Storage\c++\log\log4cplus
[root@ubuntu0006:/media/hankin/vdb/study/log4cplus] #g++ standard.cpp -llog4cplus -std=c++11
[root@ubuntu0006:/media/hankin/vdb/study/log4cplus] #./a.out
./a.out: error while loading shared libraries: liblog4cplus-2.0.so.3: cannot open shared object file: No such file or directory
[root@ubuntu0006:/media/hankin/vdb/study/log4cplus] #ldd a.out
linux-vdso.so.1 => (0x00007ffd877fc000)
liblog4cplus-2.0.so.3 => not found
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ffa4a875000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ffa4a65f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffa4a295000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ffa49f8c000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffa4abf7000)
[root@ubuntu0006:/media/hankin/vdb/study/log4cplus] #find /usr/local/lib/ -name liblog4cplus-2.0.so.3
/usr/local/lib/liblog4cplus-2.0.so.3
[root@ubuntu0006:/media/hankin/vdb/study/log4cplus] #ln -s /usr/local/lib/liblog4cplus-2.0.so.3 /lib/x86_64-linux-gnu/liblog4cplus-2.0.so.3
[root@ubuntu0006:/media/hankin/vdb/study/log4cplus] #ldd a.out
linux-vdso.so.1 => (0x00007ffc26f7e000)
liblog4cplus-2.0.so.3 => /lib/x86_64-linux-gnu/liblog4cplus-2.0.so.3 (0x00007fc01bcc9000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fc01b947000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fc01b731000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc01b367000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc01b05e000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc01ae41000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc01bf55000)
[root@ubuntu0006:/media/hankin/vdb/study/log4cplus] #./a.out
07/11/22 03:26:12 - This is the FIRST log message... [standard.cpp:37]
07/11/22 03:26:13 - This is the SECOND log message... [standard.cpp:39]
4、关于日志文件属性问题
使用root程序执行会创建644,使用普通用户创建664,最终想法是创建666。 这该如何去解决呢???
[root@ubuntu0006:/media/hankin/vdb/study/log4cplus] #stat log/log
文件:'log/log'
大小:330 块:8 IO 块:4096 普通文件
设备:fd10h/64784d Inode:6443740 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2022-07-11 20:07:09.436000000 +0800
最近更改:2022-07-11 20:06:54.600000000 +0800
最近改动:2022-07-11 20:06:54.600000000 +0800
创建时间:-
hejian@ubuntu0006:~/log$ stat log
文件:'log'
大小:330 块:8 IO 块:4096 普通文件
设备:fd01h/64769d Inode:270599 硬链接:1
权限:(0664/-rw-rw-r--) Uid:( 1001/ hejian) Gid:( 1001/ hejian)
最近访问:2022-07-12 09:56:41.700000000 +0800
最近更改:2022-07-12 09:56:41.700000000 +0800
最近改动:2022-07-12 09:56:41.700000000 +0800
创建时间:-
最终没有找到答案,使用系统调用函数chmod改变文件属性。
5、log4cpp和log4cplus,以及log4cxx区别
用了一下log4cxx和log4cplus,感觉log4cxx性能更好,同样是配置FileAppender写相同格式的100w行日志,单线程,linux 目前最新版的log4cxx只需要10-11秒,而最新版的log4cplus需要15-16秒,直接获取时间写日志文件,只需要1-2秒,如果每行都fflush的话,会达到4-5秒。
有人说 EzLogger 比上边三个好用 http://axter.com/ezlogger
Google 的 Glog很差劲吗?
折腾了log4cplus,log4cxx,log4cpp,最终选择log4cplus。 log4cplus: 简洁, 下载的包编译顺利, 测试例子也能顺利运行。 log4cxx: 臃肿, 需要引用apr(Apache Portable Runtime), 最痛苦的是老是编译不了。 log4cpp: 落后, 最后更新于2007年,而且下载的包不完整。
6、日志文件配置
https://zcteo.top/blog/CXX/007_log4cplusPropertyConfigurator
没有太多时间去深究。
详细教程见:https://blog.csdn.net/kakiebu/article/details/105469965 https://blog.csdn.net/weixin_44498318/article/details/115544863
7、多进程log4cxx区分日志
https://blog.csdn.net/jq0123/article/details/22430565
#include <log4cplus/mdc.h>
log4cplus::getMDC().put(LOG4CPLUS_TEXT("tag"), LOG4CPLUS_TEXT("hejian"));
LOG4CPLUS_TRACE(g_logger_root, LOG4CPLUS_TEXT("Hello, log4cplus!"));
log4cplus.appender.APPNDER_FILE.layout.ConversionPattern=[%D] %p %t [%l] [%X{tag}]%m%n