log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工程中会比较专业的,:),本文介绍了log4cplus基本概念,以及如何安装,配置。
### 简介 ###
log4cplus是C++编写的开源的日志系统,前身是java编写的log4j系统.受Apache Software License保护。作者是Tad E. Smith。log4cplus具有线程安全、灵活、以及多粒度控制的特点,通过将信息划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期; 你可以选择将信息输出到屏幕、文件、NT event log、甚至是远程服务器;通过指定策略对日志进行定期备份等等。
### 下载 ###
最新的log4cplus可以从以下网址下载 http://log4cplus.sourceforge.net本文使用的版本为:1.0.4
2. windows下的配置
将"log4cplus_dll class"工程或"log4cplus_static class"工程的dsp 文件插入到你的工程中,或者直接把两个工程编译生成的库以及头文件所在目录放到你的工程的搜索路径中,如果你使用静态库,请在你的工程中"project/setting/C++"的preprocessor definitions中加入LOG4CPLUS_STATIC。
进入log4cplus-1.0.4\log4cplus-1.0.4\msvc8目录,双击log4cplus.sln使用Microsoft Visual Studio 2010打开文件。
编译生成新的动态库或者静态库:
拷贝log4cplusSD.lib(静态库)以及 log4cplusD.lib + log4cplusD.dll (动态库)
注意:使用静态链接,只需要log4cplusSD.lib即可,而使用动态链接,则需要log4cplusD.lib + log4cplusD.dll 2个文件。
3。具体配置
首先,将log4cplus 头文件,拷贝到Microsoft Visual Studio 2010安装目下的include下,如:
将,log4cplusSD.lib以及log4cplusD.lib 拷贝到Microsoft Visual Studio 2010安装目下的lib下,如:
将log4cplusD.dll拷贝到Microsoft Visual Studio 2010安装目下的bin下,如:
4。在环境配置完成后,我们可以对具体的项目环境进行配置。
我们创建一个控制台项目,并进行如下配置:
1。采用静态链接库:
右键项目->属性->
加入log4cplusSD.lib
注意:才用静态链接库,可以删除bin目录下的log4cplusD.dll 以及lib目录下的log4cplusD.lib 2个文件。
2。采用动态链接库:
右键项目->属性->
注意:才用动态链接库,需要bin目录下的log4cplusD.dll 以及lib目录下的log4cplusD.lib 2个文件。可以删除lib目录下的log4cplusSD.lib 文件
5.编写简单程序并测试
#include "stdafx.h" #include <log4cplus/logger.h> #include <log4cplus/configurator.h> #include <iomanip> using namespace log4cplus; int _tmain(int argc, _TCHAR* argv[]) { BasicConfigurator config; config.configure(); Logger logger = Logger::getInstance("main"); LOG4CPLUS_WARN(logger, "Hello, World!"); getchar(); return 0; }
注意:
log4cplus官方源码采用的“多字节字符集”,如果你项目采用“使用 Unicode 字符集”则可以将log4cplus字符集修改后重新生成对应的库文件!
以下为常用的封装好的测试实例:
VLog.h
#pragma once #ifndef VLOG_H #define VLOG_H #include <log4cplus/logger.h> #include <log4cplus/layout.h> #include <log4cplus/loglevel.h> #include <log4cplus/fileappender.h> #include <log4cplus/consoleappender.h> #include <log4cplus/helpers/loglog.h> using namespace log4cplus; using namespace helpers; /** * 使用log4cplus * @param logfile 记录的文件路径,如“main.log” * @param format 格式化前缀,默认%d [%l] %-5p : %m %n * @param bebug 是否打印bebug信息,默认true * @param lv 设置日记级别 * @return */ void InitLog4cplus( const wchar_t* logfile, const bool console = true, const bool bebug = true, LogLevel lv = DEBUG_LOG_LEVEL, const wchar_t* format = L"%d : %m%n" /*%d %-5p [%c < %l] : %m %n*/ ); /** * 获得根日志 * @return */ Logger GetRootLogger(void); /** * 获得子日志 * @param child 子日志名,如,sub;sub.sub1 * @return */ Logger GetSubLogger(const wchar_t* sub); /** * 关闭日志系统 */ void ShutdownLogger(void); #endif /* VLOG_H */
/************************************************************************/ /* 使用规则: */ /* 需要log4cplus动态/静态链接库及头文件 */ /* log4cplus.lib + log4cplus.dll 为动态链接库。log4cplusS.lib为静态链接库 */ /************************************************************************/ #include "VLog.h" void InitLog4cplus(const wchar_t* logfile, const bool console, const bool bebug, LogLevel lv, const wchar_t* format) /* NOT_SET_LOG_LEVEL ( -1) :接受缺省的LogLevel,如果有父logger则继承它的 LogLevelALL_LOG_LEVEL ( 0) :开放所有log信息输出 TRACE_LOG_LEVEL ( 0) :开放trace信息输出(即ALL_LOG_LEVEL) DEBUG_LOG_LEVEL (10000) :开放debug信息输出 INFO_LOG_LEVEL (20000) :开放info信息输出 WARN_LOG_LEVEL (30000) :开放warning信息输出 ERROR_LOG_LEVEL (40000) :开放error信息输出 FATAL_LOG_LEVEL (50000) :开放fatal信息输出 OFF_LOG_LEVEL (60000) :关闭所有log信息输出 */ { // 0.日志系统配置:设置显示debug信息 LogLog::getLogLog()->setInternalDebugging(bebug); // 创建屏幕输出Appender,不采用stderror流,不采用立刻写入模式 SharedAppenderPtr pappender1(new RollingFileAppender(logfile, 1024 * 1024 * 200, 50, false)); // 生成的日志文件名称,文件最大值(最小1 * 200 M),扩展50文件个数,不采用立刻写入模式 // 2.实例化一个layout对象 // 2.1创建layout布局格式 std::auto_ptr<Layout> playout1(new PatternLayout(format)); // 3.将layout对象绑定(attach)到appender对象 // pappender.setLayout(std::auto_ptr<Layout> layout); pappender1->setLayout(playout1); // 4.Logger :记录器,保存并跟踪对象日志信息变更的实体,当你需要对一个对象进行记录时,就需要生成一个logger。 Logger rootLogger = Logger::getRoot(); // 5.将appender对象绑定(attach)到logger对象,如省略此步骤,标准输出(屏幕)appender对象会绑定到logger rootLogger.addAppender(pappender1); if (console) { // 1.Appenders :挂接器,与布局器紧密配合,将特定格式的消息输出到所挂接的设备终端 (如屏幕,文件等等)。 SharedAppenderPtr pappender2(new ConsoleAppender(false, false)); std::auto_ptr<Layout> playout2(new PatternLayout(format)); pappender2->setLayout(playout2); rootLogger.addAppender(pappender2); } // 6.设置logger的优先级,如省略此步骤,各种有限级的消息都将被记录 rootLogger.setLogLevel(lv); } Logger GetRootLogger(void) { return Logger::getRoot(); } Logger GetSubLogger(const wchar_t* sub) { return Logger::getInstance(sub); } void ShutdownLogger(void) { Logger::getRoot().shutdown(); }
#include "VLog.h"
int _tmain(int argc, _TCHAR* argv[])
{
// 加入log4cplus // 初始化log4cplus InitLog4cplus(L"main.log");</p><p> // 日志对象:测试一 log4cplus::Logger test1 = GetSubLogger(L"test1"); // 日志对象:测试一 第一次测试 log4cplus::Logger test1_01 = GetSubLogger(L"test1.01");</p><p> // 类型日志记录 LOG4CPLUS_DEBUG(test1_01, "you can log like this :" << "hello " << 100 << '!');</p><p> // 关闭日志 ShutdownLogger(); }