某公司的应用程序的日志系统使用了log4cxx,我以前没有用个,现在摸索一下怎么使用。因为不同人的主机环境不一样,所以,我在模式的过程中也出现了各种其他的问题,现在将自己出现的问题总结一下。以备后续参考。
下载软件
需要三个,分别是apr、apr-util和log4cxx。以下是下载路径。
https://apr.apache.org/download.cgi
https://logging.apache.org/log4cxx/latest_stable/download.html

编译apr-1.7.0.tar.gz
解压缩apr-1.7.0.tar.gz
进入apr-1.7.0目录
./configure --prefix=$HOME
--prefix的参数的意思把目标的库文件安装到指定的目录
我这个是docker的容器,提示如下错误
rm: cannot remove 'libtoolT': No such file or directory
先安装一些原来系统中没有的工具
yum install autoconf automake libtool
然后再次运行上述configure,有的镜像就没有错误提示了,有的还有。如果还有,将configure文件中的RM='$RM'修改为 RM='$RM -f ',这个相当于是,如果删除失败,就不管他了。然后输入
make && make install
程序也能编译成功,此时会在$HOME/lib中放入编译好的库文件libapr-1.so等

编译apr-util-1.6.1.tar.gz
解压缩apr-util-1.6.1.tar.gz
进入apr-util-1.6.1.tar目录
./configure --prefix=$HOME -with-apr=$HOME
make
此时,程序会报错,提示信息如下:
apr_xml.c:35:19: fatal error: expat.h: No such file or directory
说明操作系统又缺少一个工具,安装它:
yum install expat-devel
make install
此时会在$HOME/lib中放入编译好的库文件libaprutil-1.so等

编译apache-log4cxx-0.11.0.tar.gz
解压缩apache-log4cxx-0.11.0.tar.gz
进入apache-log4cxx-0.11.0.tar
./configure --with-charset=utf-8  --with-apr=${HOME}  --with-apr-util=${HOME}
会有如下错误
missing aclocal-1.16 -I ………… aclocal-1.16: command not found
可以输入 autoreconf -ivf 来解决

make && make install
然后就可以看到我们编译好的文件了,一共有两份。这个没有放到$HOME/lib中的原因就是上面的configure中没有添加--prefix的路径指定
sh-4.2# find / -name "*liblog4cxx*" -exec ls -l {} \;
-rw-r--r-- 1 root root 38329992 Apr  9 13:54 /usr/local/lib/liblog4cxx.a
-rw-r--r-- 1 root root 1039 Apr  9 13:54 /usr/local/lib/pkgconfig/liblog4cxx.pc
lrwxrwxrwx 1 root root 20 Apr  9 13:54 /usr/local/lib/liblog4cxx.so -> liblog4cxx.so.11.0.0
lrwxrwxrwx 1 root root 20 Apr  9 13:54 /usr/local/lib/liblog4cxx.so.11 -> liblog4cxx.so.11.0.0
-rwxr-xr-x 1 root root 14307728 Apr  9 13:54 /usr/local/lib/liblog4cxx.so.11.0.0
-rwxr-xr-x 1 root root 1039 Apr  9 13:54 /usr/local/lib/liblog4cxx.la
-rw-r--r-- 1 root root 1039 Apr  9 13:45 /root/download/apache-log4cxx-0.11.0/liblog4cxx.pc
-rw-r--r-- 1 root root 1029 Aug  6  2020 /root/download/apache-log4cxx-0.11.0/liblog4cxx.pc.in
-rw-r--r-- 1 root root 38329992 Apr  9 13:54 /root/download/apache-log4cxx-0.11.0/src/main/cpp/.libs/liblog4cxx.a
lrwxr-xr-x 1 root root 16 Apr  9 13:54 /root/download/apache-log4cxx-0.11.0/src/main/cpp/.libs/liblog4cxx.la -> ../liblog4cxx.la
-rw-r--r-- 1 root root 1039 Apr  9 13:54 /root/download/apache-log4cxx-0.11.0/src/main/cpp/.libs/liblog4cxx.lai
lrwxr-xr-x 1 root root 20 Apr  9 13:53 /root/download/apache-log4cxx-0.11.0/src/main/cpp/.libs/liblog4cxx.so -> liblog4cxx.so.11.0.0
lrwxr-xr-x 1 root root 20 Apr  9 13:53 /root/download/apache-log4cxx-0.11.0/src/main/cpp/.libs/liblog4cxx.so.11 -> liblog4cxx.so.11.0.0
-rwxr-xr-x 1 root root 14307728 Apr  9 13:53 /root/download/apache-log4cxx-0.11.0/src/main/cpp/.libs/liblog4cxx.so.11.0.0
-rw-r--r-- 1 root root 1038 Apr  9 13:54 /root/download/apache-log4cxx-0.11.0/src/main/cpp/liblog4cxx.la

写个代码来测试
在使用之前,按照c++开发的惯例,先把apache-log4cxx-0.11.0/src/main里面的include目录单独复制出来一份,放到我的工程的根目录下。如果不想复制也可以的,需要在编译的时候自行指定好include的路径。这两个方法的区别就是在编写代码的时候#include指令,需要用双引号或者尖括号。
这段代码参考了其他网友的。

#include "log4cxx/logger.h"
#include "log4cxx/logstring.h"
#include "log4cxx/propertyconfigurator.h"using namespace log4cxx;int main(int argc, char *argv[])
{// 读取配置文件PropertyConfigurator::configure("log4cxx.properties");// 建立两个loggerLoggerPtr logger1 = Logger::getLogger(argv[0]);LOG4CXX_TRACE(logger1, "跟踪");LOG4CXX_WARN(logger1, "警告");LOG4CXX_DEBUG(logger1, "调试");LOG4CXX_ASSERT(logger1, false, "断言");LOG4CXX_FATAL(logger1, "致命");return 0;
}

编写日志文件,文件名称是log4cxx.properties

#设置rootlogger为DEBUG级别,使用了ca和fa两个Appender
log4j.rootLogger=DEBUG,ca, fa#对Appender fa进行设置:
#这是一个文件类型的Appender,
#其输出文件(File)为./output.log,
#输出方式(Append)为覆盖方式,
#输出格式(layout)为PatternLayout
log4j.appender.fa=org.apache.log4j.FileAppender
log4j.appender.fa.File=./output.log
log4j.appender.fa.Append=true
log4j.appender.fa.layout=org.apache.log4j.PatternLayout
log4j.appender.fa.layout.ConversionPattern=%d [%t] %-5p %c %l - %m%n#对Appender ca进行设置:
#这是一个控制台类型的Appender
#输出格式(layout)为PatternLayout
log4j.appender.ca=org.apache.log4j.ConsoleAppender
log4j.appender.ca.layout=org.apache.log4j.PatternLayout
log4j.appender.ca.layout.ConversionPattern=%d [%t] %-5p %c %l - %m%n

在我的docker中的rhel7.3中,下面的命令是无法连接通过的。
sh-4.2# g++ log4cxx_main.cpp -o log4cxx_main -Wall -O3 -g3 -L /usr/local/lib/ -llog4cxx
/root/lib/libaprutil-1.so.0: undefined reference to `XML_ErrorString'
/root/lib/libaprutil-1.so.0: undefined reference to `XML_SetUserData'
/root/lib/libaprutil-1.so.0: undefined reference to `XML_ParserFree'
/root/lib/libaprutil-1.so.0: undefined reference to `XML_SetElementHandler'
/root/lib/libaprutil-1.so.0: undefined reference to `XML_SetCharacterDataHandler'
/root/lib/libaprutil-1.so.0: undefined reference to `XML_GetErrorCode'
/root/lib/libaprutil-1.so.0: undefined reference to `XML_SetEntityDeclHandler'
/root/lib/libaprutil-1.so.0: undefined reference to `XML_StopParser'
/root/lib/libaprutil-1.so.0: undefined reference to `XML_ParserCreate'
/root/lib/libaprutil-1.so.0: undefined reference to `XML_Parse'

我们把各种其他的库引用起来,它缺少对其他库的引用。实际上,libexpat是不在我单独自己指定的/root/lib中的,他是yum install expat-devel来安装后自己放到/lib64下的。可以通过ldconfig -p | grep expat这个命令来查找到。以下是完整的编译命令,而不管apr什么的它实际用不用:
g++ log4cxx_main.cpp -o log4cxx_main -Wall -O3 -g3 -L /usr/local/lib/ -llog4cxx -L/root/lib -lapr-1 -laprutil-1 -lexpat

修改运行库
因为我把apr和apr-uitl放在了自己指定的/root/lib中,把log4cxx放到了默认的/usr/local/lib/,所以要把这两个路径追加到运行库环境中,或者直接修改环境变量文件。
LD_LIBRARY_PATH=/usr/local/lib/:/root/lib:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH

运行程序
sh-4.2# ./log4cxx_main
2021-04-10 00:03:36,315 [0x7f1e42de4740] WARN  ./log4cxx_main log4cxx_main.cpp(16) - 警告
2021-04-10 00:03:36,318 [0x7f1e42de4740] DEBUG ./log4cxx_main log4cxx_main.cpp(17) - 调试
2021-04-10 00:03:36,321 [0x7f1e42de4740] ERROR ./log4cxx_main log4cxx_main.cpp(18) - 断言
2021-04-10 00:03:36,323 [0x7f1e42de4740] FATAL ./log4cxx_main log4cxx_main.cpp(19) - 致命
此时,目录中有个output.log的日志文件,初次运行的时候,内容与上面一样。我的目录中的文件是:

sh-4.2# ls -lrt
total 156
drwxr-xr-x 7 1000 1000    224 Apr  9 13:45 include
-rw-r--r-- 1 root root    541 Apr  9 23:24 log4cxx_main.cpp
-rwxr-xr-x 1 root root 145152 Apr  9 23:24 log4cxx_main
-rw-r--r-- 1 root root    826 Apr  9 23:32 log4cxx.properties
-rw-r--r-- 1 root root    368 Apr 10 00:04 output.log

在rhel7.3中编译和使用log4cxx相关推荐

  1. 【Qt】在QtCreator中编译log4cplus

    在QtCreator中编译log4cplus 一.在QtCreator中配置cmake 二.编译log4cplus 1.下载 2.编译.安装 一.在QtCreator中配置cmake 参见博客:htt ...

  2. 关于使用JAVA中JDK安装和在命令行中编译和运行程序的一些总结

    JDK安装:http://www.oracle.com/technetwork/java(可以选择安装路径) (在写下载这个JDK时需要先创建账户) 1.下载完之后就可以安装了,安装路径自己可以设置, ...

  3. [转载]在Eclipse CDT中编译含有多个main函数的项目

    在Eclipse CDT中编译含有多个main函数的项目 在C/C++项目中有时候会需要在一个项目中包含多个main函数.在Visual Studio中,这种情况可以由一个解决方案下带多个项目来解决, ...

  4. 关于ios中编译ffmpeg0.9.2库

    很多朋友在问如何在ios中编译ffmpeg库,虽说网上的教程很多,但是大部分都说按其操作,最后编译总是不成功,正好我最近的项目要用到ffmpeg,所以就再次编译了,同时在这里记下,方便需要参考的朋友. ...

  5. list在codeblocks和vs2013中编译提示不同

    代码如下: #include <iostream> #include <list>using namespace std;int main(void) {list<int ...

  6. Visual studio中编译和使用libpng和zlib

    Visual studio中编译和使用libpng和zlib https://blog.csdn.net/jinzhuojun/article/details/7972747 转载于:https:// ...

  7. 【Android Protobuf 序列化】Protobuf 使用 ( protobuf-gradle-plugin 插件简介 | Android Studio 中配置插件 | AS 中编译源文件 )

    文章目录 一.protobuf-gradle-plugin 插件简介 二.Android Studio 中配置 protobuf-gradle-plugin 插件 三.Android Studio 中 ...

  8. 系统中编译安装ZLMediaKit的步骤

    这篇文章给大家分享的是centos6系统中编译安装ZLMediaKit的步骤.小编觉得挺实用的,因此分享给大家学习.如下资料是编译安装的步骤.  1.安装基础编译环境 1.1 gcc-5.4的安装  ...

  9. Debian中编译内核

    转载: http://blog.163.com/libo_5/blog/static/156968520101016102051580/ http://hi.baidu.com/wg_wang/ite ...

  10. vlc android 编译 mac,在Mac中编译vlc-android小结

    在Mac中编译vlc-android小结 在Mac中编译vlc-android小结 VLC  CodeSource https://code.videolan.org/explore This pag ...

最新文章

  1. 上升沿_不懂上升、下降沿的我,高兴惨了!
  2. DNS主从类型的架设
  3. Mybatis ResolverUtil的设计概念
  4. c语言从入门到精通ppt,C语言从入门到精通第1章.ppt
  5. 竟然有如何奇葩的如厕方式......
  6. spark多个kafka source采用同一个group id导致的消费堆积延迟
  7. SAP License:SAP标准教材的编号原则
  8. C/C++面试题总结
  9. IP地址库Linux系统从APNIC获取地址库
  10. bzoj1783: [Usaco2010 Jan]Taking Turns
  11. Sigar介绍与使用
  12. java代码走查_java代码开发完成后,代码走查规范
  13. Matlab聚类分析/判别分析
  14. VNC远程桌面安装配置
  15. 乒乓球技术要领总结(保持更新)
  16. 英语思维导图大全 连词(六)
  17. bootstrap登录模板
  18. 数据驱动的软件智能化开发| ChinaOSC
  19. 2020大数据学习资料,全套源码无加密网盘下载
  20. 二进制#逻辑计算#与(∧)、或(∨)、非(¬)、异或(⨁)#与,或,非,异或的运算法则#与,或,非,异或运算的基础代码

热门文章

  1. html直接使用marked.js解析marked文档
  2. html5标题分栏,网页分栏设计和不同的CSS样式
  3. Microsoft Word 教程:如何在 Word 中创建项目符号列表、显示字数统计?
  4. GCC中的编译选项“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数
  5. 痴迷技术,青春无悔,我那不务正业的大学时光!
  6. 数学三次危机(四)第一次数学危机
  7. java手机充值_话费充值示例代码
  8. Apache-Flink深度解析-JOIN-LATERAL-Time Interval(Time-windowed)
  9. STM32超低功耗入门之低功耗运行模式
  10. 从蚂蚁的觅食过程看团队研发(转载)