最近一段时间在使用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