重新编译log4cxx工程:
1.用svn工具checkout最新的代码。地址:http://svn.apache.org/repos/asf//logging/log4cxx/trunk
2.使用VS2008【文件】->【新建】->【从现有代码创建项目】,选择log4cxx\src\main文件夹。
3.配置工程属性为lib类型,添加预处理器宏LOG4CXX,并选择相应的运行库(根据EXE工程而定,否则可能会有运行库冲突)。
4.编译。(编译过程中会出现xx.h头文件找不到的情况,根据错误信息找到指定的头文件目录,包含进引用目录)这里还涉及到了Apache的apr、aprutil两个lib、dll库及头文件。
确定在编译之前已经将旧版本的log4cxx头文件目录移除,否则可能会有相关函数声明不一致导致的编译错误。
5.新建EXE工程,调用第4步生成的lib库。注意EXE工程属性和生成lib库的log4cxx工程属性一致,否则可能有运行库冲突。另外可能需要依赖libapr.lib、libaprutil.lib、odbc32.lib、advapi32.lib
、rpcrt4.lib这几个库文件。
1.用svn工具checkout最新的代码。地址:http://svn.apache.org/repos/asf//logging/log4cxx/trunk
2.使用VS2008【文件】->【新建】->【从现有代码创建项目】,选择log4cxx\src\main文件夹。
3.配置工程属性为lib类型,添加预处理器宏LOG4CXX,并选择相应的运行库(根据EXE工程而定,否则可能会有运行库冲突)。
4.编译。(编译过程中会出现xx.h头文件找不到的情况,根据错误信息找到指定的头文件目录,包含进引用目录)这里还涉及到了Apache的apr、aprutil两个lib、dll库及头文件。
确定在编译之前已经将旧版本的log4cxx头文件目录移除,否则可能会有相关函数声明不一致导致的编译错误。
5.新建EXE工程,调用第4步生成的lib库。注意EXE工程属性和生成lib库的log4cxx工程属性一致,否则可能有运行库冲突。另外可能需要依赖libapr.lib、libaprutil.lib、odbc32.lib、advapi32.lib
、rpcrt4.lib这几个库文件。
6.运行。将libapr.dll、libaprutil.dll等dll拷贝到EXE目录。(缺少某一个dll文件时,EXE会有提示,找到该dll拷贝到EXE运行目录下即可)
///
附(工程中代码修改日志属性相关代码)
#include <log4cxx/log4cxx.h>
#include <log4cxx/helpers/properties.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/logmanager.h>
//#pragma comment(lib, "log4cxx.lib")
#pragma comment(lib, "log4cxx_project.lib")
using namespace log4cxx;
using namespace log4cxx::helpers;
namespace log4cxx_configue
{
// 初始日志存储文件名及方式
static void InitLogFile(CStringA strProjectName)
{
#ifdef _LOG_FILE
CStringA strLogPath("");
strLogPath = "./conf/" + strProjectName + ".properties";
#if _MSC_VER >= 1500
log4cxx::PropertyConfigurator::configure(log4cxx::File(strLogPath));
#else
log4cxx::PropertyConfigurator::configure(strLogPath.GetBuffer());
#endif
#else
strProjectName.Empty();
#endif
}
void mytest()
{
log4cxx::helpers::Properties properties;
//try
//{
// LogString strKey = L"log4j.rootLogger";
// LogString strValue = L"DEBUG";
// properties.setProperty(strKey, strValue);
//}
//catch (std::length_error &e)
//{
// const char *pError = e.what();
// TRACE(pError);
//}
properties.setProperty(L"log4j.rootLogger",L"FATAL");
properties.setProperty(L"log4j.appender",L"ca");
properties.setProperty(L"log4j.appender",L"fa");
properties.setProperty(L"log4j.appender.fa",L"org.apache.log4j.FileAppender");
properties.setProperty(L"log4j.appender.fa.Append",L"false");
properties.setProperty(L"log4j.appender.fa.File",L"./test.log");
properties.setProperty(L"log4j.appender.fa.layout",L"org.apache.log4j.PatternLayout");
properties.setProperty(L"log4j.appender.fa.layout.ConversionPattern",L"%d [%t] %-5p %.16c - %m%n");
properties.setProperty(L"log4j.appender.ca",L"org.apache.log4j.ConsoleAppender");
properties.setProperty(L"log4j.appender.ca.layout",L"log4j.appender.ca.layout");
properties.setProperty(L"log4j.appender.ca.layout.ConversionPattern",L"%d [%t] %-5p %.16c - %m%n");
log4cxx::PropertyConfigurator::configure(properties);
}
void testInherited()
{
Properties props;
props.put(LOG4CXX_STR("log4j.rootLogger"),LOG4CXX_STR("DEBUG,VECTOR1"));
props.put(LOG4CXX_STR("log4j.logger.org.apache.log4j.PropertyConfiguratorTest"), LOG4CXX_STR("inherited,VECTOR2"));
props.put(LOG4CXX_STR("log4j.appender.VECTOR1"), LOG4CXX_STR("org.apache.log4j.VectorAppender"));
props.put(LOG4CXX_STR("log4j.appender.VECTOR2"), LOG4CXX_STR("org.apache.log4j.VectorAppender"));
PropertyConfigurator::configure(props);
LoggerPtr logger = Logger::getLogger("org.apache.log4j.PropertyConfiguratorTest");
Logger::getRootLogger()->setLevel(Level::getError());
LogManager::resetConfiguration();
}
void testNull()
{
Properties props;
props.put(LOG4CXX_STR("log4j.rootLogger"),LOG4CXX_STR("DEBUG,VECTOR1"));
props.put(LOG4CXX_STR("log4j.logger.org.apache.log4j.PropertyConfiguratorTest"), LOG4CXX_STR("NuLL,VECTOR2"));
props.put(LOG4CXX_STR("log4j.appender.VECTOR1"), LOG4CXX_STR("org.apache.log4j.VectorAppender"));
props.put(LOG4CXX_STR("log4j.appender.VECTOR2"), LOG4CXX_STR("org.apache.log4j.VectorAppender"));
PropertyConfigurator::configure(props);
LoggerPtr logger = Logger::getLogger("org.apache.log4j.PropertyConfiguratorTest");
Logger::getRootLogger()->setLevel(Level::getError());
LogManager::resetConfiguration();
}
void testAppenderThreshold()
{
Properties props;
props.put(LOG4CXX_STR("log4j.rootLogger"), LOG4CXX_STR("ALL,VECTOR1"));
props.put(LOG4CXX_STR("log4j.appender.VECTOR1"), LOG4CXX_STR("org.apache.log4j.VectorAppender"));
props.put(LOG4CXX_STR("log4j.appender.VECTOR1.threshold"), LOG4CXX_STR("WARN"));
PropertyConfigurator::configure(props);
LoggerPtr root(Logger::getRootLogger());
LOG4CXX_INFO(root, "Info message")
LOG4CXX_WARN(root, "Warn message")
LOG4CXX_WARN(root, "Error message")
LogManager::resetConfiguration();
}
}
CString GetLevelString(int nLevel)
{
switch (nLevel)
{
case 5000:
return _T("TRACE");
case 10000:
return _T("DEBUG");
case 20000:
return _T("INFO");
case 30000:
return _T("WARN");
case 40000:
return _T("ERROR");
case 50000:
return _T("FATAL");
default:
return _T("UNKNOWN");
}
}
void Clog4cxx_configueDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//OnOK();
log4cxx_configue::InitLogFile("LOG4CXX");
log4cxx::LoggerPtr logger = log4cxx::Logger::getRootLogger();
int nLevel = logger->getEffectiveLevel()->toInt();
AfxMessageBox(GetLevelString(nLevel));
//log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger("com.foo"));
//logger->setLevel(log4cxx::Level::getInfo());
//LOG4CXX_INFO(logger, "HHHHHHELLO");
log4cxx_configue::testInherited();
log4cxx_configue::mytest();
logger = log4cxx::Logger::getRootLogger();
nLevel = logger->getEffectiveLevel()->toInt();
AfxMessageBox(GetLevelString(nLevel));
//log4cxx_configue::testNull();
//log4cxx_configue::testAppenderThreshold();
}