最近一段时间在使用C++写程序,其中需要使用日志功能,便顺手“拿来”了log4cxx。从Apache网站上下载的log4cxx只有源代码,需要自己编译出dll,通过官方文档所说的办法编译,出现了一些小问题,参考了网上“高人”的网文,自己整理了其中的一些错误的解决办法:
1、准备工作
unzip apr-1.2.11-win32-src.zip
rename apr-1.2.11 apr
unzip apr-util-1.2.10-win32-src.zip
rename apr-util-1.2.10 apr-util
cd apache-log4cxx-0.10.0
configure
configure-aprutil
其中执行configure-aprutil时候说sed命令不存在,解决办法:下载sed for windows,并且把bin路径赋值给环境变量PATH。
2、Visual C++ 2010打开log4cxx项目编译
1)通过VC++ 2010打开项目,VC会自动做项目转换,一般来说这里不会出错。接着选择log4cxx为Active Project,编译。出现一大堆错误。主要都是error C2252: an explicit instantiation of a template can only occur at namespace scope这个,解决办法:
#define LOG4CXX_LIST_DEF(N, T) /
template class LOG4CXX_EXPORT std::allocator<T>; /
template class LOG4CXX_EXPORT std::vector<T>; /
typedef std::vector<T> N
替换为
#define LOG4CXX_LIST_DEF(N, T) /
typedef std::vector<T> N
2)编译成功后,链接过程又抛一大堆链接错误,主要说找不要一些obj(apr,apr-util,xml)。解决办法:手动把这些相关项目的LIBD给添上。
3、测试log4cxx的DLL
在测试项目里添加include和lib指向,把dll添加到项目的文件夹里,编写测试cpp文件,编写log4cxx.properties文件,编译运行即可。
test.cpp
#include <log4cxx/logger.h>
#include <log4cxx/propertyconfigurator.h>
using namespace std;
using namespace log4cxx;
int main(int argc, char* argv[])
{
string trace = "fa";
string Property = "./log.properties";
log4cxx::PropertyConfigurator::configure(Property);
LoggerPtr logger = Logger::getLogger(trace);
logger->info(("How to use?"));
LOG4CXX_INFO(logger, ("你说Hello"));
for (int i = 0; i < 2; i++)
{
LOG4CXX_DEBUG(logger, "DEBUG");
LOG4CXX_INFO(logger, "INFO");
LOG4CXX_WARN(logger, "WARN");
LOG4CXX_ERROR(logger, "ERROR");
}
return 0;
}
log4cxx.properties
# 设置root logger为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=false
log4j.appender.fa.layout=org.apache.log4j.PatternLayout
log4j.appender.fa.layout.ConversionPattern=%d [%t] %-5p %.16c - %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 %.16c - %m%n
参考网文:
1、http://blog.youkuaiyun.com/rabbit729/archive/2008/08/05/2772179.aspx
2、http://www.hwcrazy.com/topic.action?idTopic=ff80818129d0e3210129d0e61fb30001#