log4cxx的使用

log4cxx是业界通用的日志系统,建议我们在写程序的时候可以直接拿来使用,关于工程包及相关的lib及dll文件,网上有很多说明,略过。以下只讲怎样使用。

一、建测试工程:testlog4cxx,直接选控制台应用程序, 在配置属性页中,选C/C++,常规,在附加包含目录中加入“./”;选链接器,常规,在附加库目录中加入"./",点选中常规下面的输入,在附加依赖项中加入“log4cxx/log4cxx.lib”

二、在测试工程目录下加入log4cxx文件包

三、加入include头文件:

include

include

四、定义配置文件log4cxx.properties的位置

log4cxx::PropertyConfigurator::configure("log4cxx.properties");

此处的作用为定义配置文件的位置,如果想让程序在D盘根目录下加载配置文件,可以如下定义:

log4cxx::PropertyConfigurator::configure("D:\log4cxx.properties");

五、定义不同的打印级别

此在配置文件中log4cxx.properties将会有所定义。假设有这样的场景,你必须使用别人提供一个DLL用来获取接口,此DLL中使用了log4cxx日志,然后你又想在自己的工程中同样引入log4cxx日志,为了区分你的日志和别人的日志,你该如何做呢,假设别人使用的为log4j.rootLogger顶级接口。(默认情况下,所有的日志都会在顶级接口对应的日志文件中进行记录)

这样一个设置可使得顶级接口与子接口分离:

屏蔽gather的Appender继承

log4j.additivity.gather = false

以下配置假设引用的DLL库使用了log4cxx的根接口,并且输出两种级别的文件,一种为error,一种为debug

设置root logger为DEBUG级别,使用了两个Appender log4j.rootLogger=DEBUG, COM, ERR

设置sample logger为DEBUG级别 log4j.logger.sample = DEBUG, sample # 屏蔽sample的Appender继承 log4j.additivity.sample = false

log4j.logger.sample.error = WARN, sample.error #log4j.additivity.sample.error = false

log4j.appender.COM=org.apache.log4j.RollingFileAppender log4j.appender.COM.File=../log/dll_output.log log4j.appender.COM.Append=false log4j.appender.COM.MaxFileSize=3MB log4j.appender.COM.MaxBackupIndex=10 log4j.appender.COM.ImmediateFlush=true log4j.appender.COM.layout=org.apache.log4j.PatternLayout log4j.appender.COM.layout.ConversionPattern=%d %-5p %m%n

log4j.appender.ERR=org.apache.log4j.RollingFileAppender log4j.appender.ERR.File=../log/dll_error.log log4j.appender.ERR.Append=false log4j.appender.ERR.Threshold=ERROR log4j.appender.ERR.MaxFileSize=3MB log4j.appender.ERR.MaxBackupIndex=10 log4j.appender.ERR.layout=org.apache.log4j.PatternLayout log4j.appender.ERR.layout.ConversionPattern=%d %-5p %m%n

log4j.appender.sample=org.apache.log4j.RollingFileAppender log4j.appender.sample.File=../log/sample_output.log log4j.appender.sample.Append=false log4j.appender.sample.MaxFileSize=10MB log4j.appender.sample.MaxBackupIndex=10 log4j.appender.sample.ImmediateFlush=true log4j.appender.sample.layout=org.apache.log4j.PatternLayout log4j.appender.sample.layout.ConversionPattern=%d %-5p %m%n

log4j.appender.sample.error=org.apache.log4j.RollingFileAppender log4j.appender.sample.error.File=../log/sample_error.log log4j.appender.sample.error.Append=false log4j.appender.sample.error.MaxFileSize=3MB log4j.appender.sample.error.MaxBackupIndex=10 log4j.appender.sample.error.ImmediateFlush=true log4j.appender.sample.error.layout=org.apache.log4j.PatternLayout log4j.appender.sample.error.layout.ConversionPattern=%d %-5p %m%n

六、后台打印的日志与控制台显示的级别不同(一般控制台打印比较慢,显示的尽可能少,后台则尽可能详尽)

使用log4j.appender.ca.Threshold=WARN可达到控制台显示与后台打印不相同,如下一个配置文件设置:

设置root logger为DEBUG级别,使用了两个Appender log4j.rootLogger=DEBUG, server, ca

设置kline logger为DEBUG级别 log4j.logger.kline = DEBUG, kline, ca # 屏蔽kline的Appender继承 log4j.additivity.kline = false

log4j.logger.kline.error = WARN, kline.error, ca #log4j.additivity.kline.error = false

log4j.appender.server=org.apache.log4j.RollingFileAppender log4j.appender.server.File=../log/server_output.log log4j.appender.server.Append=false log4j.appender.server.MaxFileSize=3MB log4j.appender.server.MaxBackupIndex=10 log4j.appender.server.ImmediateFlush=true log4j.appender.server.layout=org.apache.log4j.PatternLayout log4j.appender.server.layout.ConversionPattern=%d %-5p %m%n

log4j.appender.server.error=org.apache.log4j.RollingFileAppender log4j.appender.server.error.File=../log/server_error.log log4j.appender.server.error.Append=false log4j.appender.server.error.Threshold=ERROR log4j.appender.server.error.MaxFileSize=3MB log4j.appender.server.error.MaxBackupIndex=10 log4j.appender.server.error.layout=org.apache.log4j.PatternLayout log4j.appender.server.error.layout.ConversionPattern=%d %-5p %m%n

log4j.appender.kline=org.apache.log4j.RollingFileAppender log4j.appender.kline.File=../log/kline_output.log log4j.appender.kline.Append=false log4j.appender.kline.MaxFileSize=10MB log4j.appender.kline.MaxBackupIndex=10 log4j.appender.kline.ImmediateFlush=true log4j.appender.kline.layout=org.apache.log4j.PatternLayout log4j.appender.kline.layout.ConversionPattern=%d %-5p %m%n

log4j.appender.kline.error=org.apache.log4j.RollingFileAppender log4j.appender.kline.error.File=../log/kline_error.log log4j.appender.kline.error.Append=false log4j.appender.kline.error.MaxFileSize=3MB log4j.appender.kline.error.MaxBackupIndex=10 log4j.appender.kline.error.ImmediateFlush=true log4j.appender.kline.error.layout=org.apache.log4j.PatternLayout log4j.appender.kline.error.layout.ConversionPattern=%d %-5p %m%n

对Appender ca进行设置: # 这是一个控制台类型的Appender # 输出格式(layout)为PatternLayout log4j.appender.ca=org.apache.log4j.ConsoleAppender log4j.appender.ca.Threshold=WARN log4j.appender.ca.layout=org.apache.log4j.PatternLayout log4j.appender.ca.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %.16c - %m%n

七、打印日志的方法

LOG4CXX_INFO(log4cxx::Logger::getLogger("hello"), "你好,log4cxx!");

以上打印方法可行,不过写起来比较麻烦,建议进行一番包装。

如下代码所示:

/******************************************************************************
author  : luhx
purpose : 日志系统,以宏log_XXX开头,封装log4cxx日志。
*******************************************************************************/
#pragma once


#include "log4cxx/logger.h"
#include "log4cxx/propertyconfigurator.h"
/*
日志类
*/

#include<string>
using namespace std;

class CServerlog;
extern CServerlog* g_serverlog;

#define log_debug(pszFormat, ...)    g_serverlog->WriteFormatDebugLog( pszFormat, __VA_ARGS__)
#define log_info(pszFormat, ...)    g_serverlog->WriteFormatInfoLog( pszFormat, __VA_ARGS__)
#define log_warn(pszFormat, ...)    g_serverlog->WriteFormatWarnLog( pszFormat, __VA_ARGS__)
#define log_error(pszFormat, ...)    g_serverlog->WriteFormatErrorLog( pszFormat, __VA_ARGS__)

class CServerlog
{
public:
CServerlog();
~CServerlog();

void WriteFormatDebugLog(char* lpszFormat, ...);
void WriteFormatInfoLog(char* lpszFormat, ...);

void WriteFormatWarnLog(char* lpszFormat, ...);
void WriteFormatErrorLog(char* lpszFormat, ...);

protected:

log4cxx::LoggerPtr infologger;
log4cxx::LoggerPtr errorlogger;
};
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include "serverlog.h"


CServerlog* g_serverlog = new CServerlog();

CServerlog::CServerlog()
{
log4cxx::PropertyConfigurator::configure("log4cxx.properties");
infologger = (log4cxx::Logger::getLogger("server"));
errorlogger = (log4cxx::Logger::getLogger("server.error"));
}

CServerlog::~CServerlog()
{
}


void CServerlog::WriteFormatDebugLog(char* lpszFormat, ...)
{
va_list args;
va_start(args, lpszFormat);
CHAR szBuffer[1024];
vsprintf(szBuffer, lpszFormat, args);
va_end(args);
infologger->debug(szBuffer);
}


void CServerlog::WriteFormatInfoLog(char* lpszFormat, ...)
{
va_list args;
va_start(args, lpszFormat);
CHAR szBuffer[1024];
vsprintf(szBuffer, lpszFormat, args);
va_end(args);
infologger->info(szBuffer);
}

void CServerlog::WriteFormatWarnLog(char* lpszFormat, ...)
{
va_list args;
va_start(args, lpszFormat);
CHAR szBuffer[1024];
vsprintf(szBuffer, lpszFormat, args);
va_end(args);

errorlogger->warn(szBuffer);
}

void CServerlog::WriteFormatErrorLog(char* lpszFormat, ...)
{
va_list args;
va_start(args, lpszFormat);
CHAR szBuffer[1024];
vsprintf(szBuffer, lpszFormat, args);
va_end(args);
errorlogger->error(szBuffer);
}

另外,发现打印出的日志在某些机器上不支持中文, 中文显示为乱码,通过在配置文件中增加如下配置项即可解决:

log4j.appender.sample.encoding=UTF-8,这里,sample即为你的日志类

相关工程已上传到如下位置:http://download.csdn.net/detail/luhouxiang/4109404
原文链接: https://www.cnblogs.com/luhouxiang/archive/2012/03/03/2378519.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/43207

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 下午7:55
下一篇 2023年2月8日 下午7:56

相关推荐