在开发过程中,log的重要性自不必说。与google的glog比起来,apache软件基金会的log更为全面,可以称之为日志系统。.Net有log4net,Java有log4j,C/C++有log4cxx。最为方便的是可以在代码和专门的配置文件中自定义日志的格式,日志文件名称,以及产生日志文件的规则等等。比如最常用的限制每个日志文件的大小、按照日期产生日志等功能。
之前用的时候就按照网上的提示,按部就班编译了一版log4cxx。但在实际使用场景中,碰到了unicode字符,宽字符和普通字符的问题。因此就想按照自己的需求编译一版。
搜遍国内外的信息,都没有找到如何顺利的自定义编译。折腾了一整天,总算有了初步的感觉。特此分享给大家,避免需要的同学重复造轮子浪费时间。
环境:
Windows10家庭中文版
Microsoft Visual Studio Community 2017
Windows SDK 版本10.0.17134.0
1,下载log4cxx
apache软件基金会官网上就能下载到最新版
https://logging.apache.org/log4cxx/latest_stable/download.html
目前能下载到的最新版本号是0.10.0
2,下载apr和apr-util
按照官网上的VS编译log4cxx的提示,需要下载apr-1.2.11和apr-util-1.2.10。注意版本匹配,并不是越新的版本越好。
apr-1.2.11-win32-src.zip 和 apr-util-1.2.10-win32-src.zip
下载地址:
https://archive.apache.org/dist/apr/
3,下载sed和几个在windows下运行sed需要的dll。
sed for windows
下载地址:
https://sourceforge.net/projects/gnuwin32/files//sed/4.2.1/sed-4.2.1-bin.zip/download
在windows下运行sed可能还需要3个dll
libiconv2.dll、libintl3.dll、regex2.dll
这个搜一下很容易下载到。
4,解压,建好目录
分别将下载好的apache-log4cxx-0.10.0.zip、apr-1.2.11-win32-src.zip、apr-util-1.2.10-win32-src.zip解压到同一个目录下,并按照官网说明,将apr-1.2.11的目录重命名为apr,apr-util-1.2.10目录重命名为apr-util。注意,这两个目录进去都直接是项目和源文件。
然后将sed.exe、libiconv2.dll、libintl3.dll、regex2.dll都放到apache-log4cxx-0.10.0目录下。
5,根据需要修改log4cxx.hw和apr.hw(重要)
根据.hw中的提示,最好不要直接修改log4cxx.h和apr.h,因为过会要执行的两个批处理configure.bat和configure-aprutil.bat会自动判断设置是否正确并复制为log4cxx.h和apr.h。
log4cxx.hw所在目录apache-log4cxx-0.10.0\src\main\include\log4cxx
首先根据自己所需的环境设置字符集
其次,由于VS2010开始不能在类内部定义模板,需要将下面两个方框中的内容删除。
arp.hw所在目录在apr\include,有一处需要修改
因原本定义为NT4的值0x400,会导致group_source_req未定义等错误。将版本定义为当前windows版本对应的值即可。该值在windows10SDK的sdkddkver.h头文件中有定义。
这里改为_WIN32_WINNT_WIN10即可。
6,修改apr_atomic.c
apr_atomic.c所在目录apr\atomic\win32
将所有InterlockedXxx函数前面的强制转换类型去掉即可,记得每个调用都需要改。
7,VS项目设置
打开apache-log4cxx-0.10.0\projects\log4cxx.dsw项目文件,转换完成后共有4个项目。
将log4cxx设置为启动项目。
然后将这4个项目的每一个属性中的Windows SDK 版本都设置为10.0.17134.0。
同时将项目设置成Release。
8,编译
到这里,准备工作都已完成。可以开始编译了。
不用在意出现的警告,编译完成后在apache-log4cxx-0.10.0\projects\Release目录下找到库文件
log4cxx.lib,log4cxx.dll。将这两个文件和apache-log4cxx-0.10.0\src\main\include\目录下的log4cxx目录一起复制出来,在想要使用log的项目中导入就可以使用了。
9,配置
log4cxx的配置文件默认的扩展名是.properties,在apache-log4cxx-0.10.0目录下搜索*.properties,可以看到很多例子。
这里用日期作为log名称,log同时输出控制台和文件。
记录的信息格式由ConversionPattern定义。每个关键字的含义在图中已注释
10,使用示例代码
先读取配置文件logconfig.properties,然后即可开始使用LOG4CXX_INFO、LOG4CXX_DEBUG等宏记录log。
如果程序没有找到配置文件logconfig.properties,就用默认的BasicConfigurator进行默认的定义。
至此,log4cxx即可使用了。
编译好的lib,dll,头文件,以及示例代码将会上传到下载区。