重新编译log4cxx工程并在代码中配置日志属性

重新编译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这几个库文件。

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();
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值