@最新ubuntu编译log4cxx_1.2.0+apr+expat+apr-util
最近写了一大堆代码,发现std::cout输出一点也不优雅,非常不利于debug。于是想到了黑天鹅log4j的同源产物:log4cxx。
开源软件总在改,特此更新一下原链接文章的内容
下载log4cxx:http://logging.apache.org/log4cxx/download.html
下载expat:https://github.com/libexpat/libexpat/releases
ubuntu 22+
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0(可以用自带的gcc版本)
需要安装:cmake 3.13+, g++, apr 1.x, apr-util 1.x, gzip and zip.
apt-get install make cmake build-essential libapr1-dev libaprutil1-dev gzip zip
tar expat-2.2.10.tar.gz
cd expat-2.2.10
./configure --prefix=/usr/local
make
sudo make install
cd ..
tar -zxvf apache-log4cxx-0.11.0.tar.gz
cd apache-log4cxx-1.2.0
mkdir build
cd build
cmake ..
make
sudo make install
testlog4cxx.cpp 源码:
#include <log4cxx/logger.h>
#include <log4cxx/logstring.h>
#include <log4cxx/xml/domconfigurator.h>
#include <log4cxx/mdc.h>
#include <log4cxx/ndc.h>
int main(int argc, char *argv[])
{
using namespace log4cxx;
// 读取配置文件
xml::DOMConfigurator::configure("log4cxx.xml");
// 建立两个logger
LoggerPtr logger = Logger::getLogger("root");
MDC::put("key", "value");
MDC::put("key2", "value2");
NDC::push("context 1");
NDC::push("context 2");
LOG4CXX_DEBUG(logger, "this is debug log");
logger->debug("this is an other log");
NDC::clear();
MDC::clear();
return 0;
}
配置文件log4cxx.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="false" xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
<param name="threshold" value="debug" />
<param name="file" value="output.xml" />
<param name="maxBackupIndex" value="5" />
<param name="append" value="true" />
<layout class="org.apache.log4j.xml.XMLLayout">
<param name="LocationInfo" value="true" />
<param name="Properties" value="true" />
</layout>
<triggeringPolicy class="org.apache.log4j.rolling.SizeBasedTriggeringPolicy">
<param name="maxFileSize" value="10MB" />
</triggeringPolicy>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="FILE" />
</root>
</log4j:configuration>
写一个优雅的Makefile
CC = g++
CFLAGS = -I/usr/local/include
LDFLAGS = -L/usr/local/lib -llog4cxx -lexpat
all: testlog4cxx
testlog4cxx: testlog4cxx.cpp
$(CC) -o $@ $< $(CFLAGS) $(LDFLAGS)
clean:
rm -f testlog4cxx
Makefile编译:
make
也可以用命令编译:
g++ -o testlog4cxx testlog4cxx.cpp -I/usr/local/include -L/usr/local/lib -llog4cxx -lexpat
运行代码:
LD_LIBRARY_PATH=/usr/local/lib ./testlog4cxx
output.xml文件输出为:
<log4j:event logger="root" timestamp="1725278892933" level="DEBUG" thread="0x7f14edb90b40">
<log4j:message><![CDATA[this is debug log]]></log4j:message>
<log4j:NDC><![CDATA[context 1 context 2]]></log4j:NDC>
<log4j:locationInfo class="" method="main" file="testlog4cxx.cpp" line="21"/>
<log4j:properties>
<log4j:data name="key" value="value"/>
<log4j:data name="key2" value="value2"/>
</log4j:properties>
</log4j:event>
<log4j:event logger="root" timestamp="1725278892933" level="DEBUG" thread="0x7f14edb90b40">
<log4j:message><![CDATA[this is an other log]]></log4j:message>
<log4j:NDC><![CDATA[context 1 context 2]]></log4j:NDC>
<log4j:locationInfo class="?" method="?" file="?" line="-1"/>
<log4j:properties>
<log4j:data name="key" value="value"/>
<log4j:data name="key2" value="value2"/>
</log4j:properties>
</log4j:event>
原文链接:https://blog.csdn.net/KiteRunner/article/details/112689268