主题 | 概要 |
---|---|
项目实践 | 为windows服务添加log4cplus日志库文件 |
编辑 | 时间 |
新建 | 20160625 |
序号 | 参考资料 |
1 | https://sourceforge.net/p/log4cplus/wiki/Home/ |
最近在做一个OpenCV处理图片的程序,需要在windows下建个服务在后台持续进行处理。项目虽小,五脏俱全。比如以前不太在意的日志功能,也要自己解决。
我的理解,以及接触中的项目,日志都有下面的几项功能:
1.能快速定位到文档中的位置,具体要到文件名和行号;
2.能够控制日志的显示级别,最好能够在程序运行中动态控制,至少也能通过更改配置文件控制;
3.存储控制功能,对于长期运行的系统,需要对日志文件进行转储备份,大小超限后,需要能自动删除。
自然的选到了Log4系列的Log4cplus系统,花费一天时间终于大功告成,下面及时记录下踩过的坑,避免忘记。
我的环境:VS2015和x64平台;
由于项目还要兼顾其他代码,不能为了log4cplus更换环境,只能让log4cplus适应这个环境。开始没注意,也没经验,导致折腾很久。
从官网下载最新版本,
https://sourceforge.net/projects/log4cplus/files/log4cplus-stable/1.1.3/
目前的最新版本是log4cplus-1.2.0.7,有意思的是以前的版本1.1.3没有一下就编译通过。
解压出来后,log4cplus-1.2.0.7目录里面有个msvc10目录,是最顺手的编译平台,用vs2010打开,里面有很多项目。实际只要编译log4cplus或就行log4cplusS。根据默认的属性编译,顺利编译成功。
在Win32/bin.Debug目录下多出三个库文件:
log4cplusSD.lib,log4cplusD.lib和log4cplusD.dll。
log4cplusD.lib和log4cplusD.dll两个要结合使用,log4cplusSD.lib能做为静态库单独使用。
我直接使用log4cplusSD.lib静态库,把它和include下面的头文件目录拷到自己设定的三方库位置,并配置好项目附加库目录属性或者直接直接放在VS2015的系统库里面。
网上有很多关于怎么调用log4cplus的AIP例子,包括怎么使用配置文件,下面进行了简单的封装,使能够全局使用。
MyLogger.h:
#pragma once
#include
#include
#include
#include
#include
#include
#include
#define MY_LOG_FILE_PATH F:/Project/ComShao/PlateRE/PlateER/etc/logconfig.properites"
using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;
class MyLogger
{
public:
static MyLogger * getInstance ();
Logger logger;
private:
MyLogger();
~MyLogger();
static MyLogger * my_logger;
};
MyLogger.cpp:
#include "../include/MyLogger.h"
MyLogger *MyLogger::my_logger = NULL;
MyLogger::MyLogger()
{
log4cplus::initialize();
PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(MY_LOG_FILE_PATH));
logger = Logger::getRoot();
}
MyLogger * MyLogger::getInstance()
{
if (my_logger==NULL)
{
my_logger = new MyLogger();
}
return my_logger;
}
MyLogger::~MyLogger()
{
if (my_logger)
{
delete my_logger;
}
}
在其他地方按下面方式使用:
MyLogger * myLoger = NULL;
myLoger = MyLogger::getInstance();
LOG4CPLUS_FATAL(myLoger->logger, "DeleteService failed,errCode=[" << GetLastError() << "]");
LOG4CPLUS_DEBUG(myLoger->logger, " Service is removed");
配置文件logconfig.properties:
#设置日志追加到文件尾
log4cplus.appender.APPNDER_FILE=log4cplus::RollingFileAppender
#设置日志文件大小
log4cplus.appender.APPNDER_FILE.MaxFileSize=100MB
#设置生成日志最大个数
log4cplus.appender.APPNDER_FILE.MaxBackupIndex=2
#设置输出日志路径
log4cplus.appender.APPNDER_FILE.File=F:\Project\ComShao\PlateRE\PlateER\log\PlateER.log
log4cplus.appender.APPNDER_FILE.layout=log4cplus::PatternLayout
#设置日志打印格式
log4cplus.appender.APPNDER_FILE.layout.ConversionPattern=|%D:%d{%Q}|%p|%t|%l|%m|%n
#设置日志级别范围
log4cplus.appender.APPNDER_FILE.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.APPNDER_FILE.filters.1.LogLevelMin=TRACE
log4cplus.appender.APPNDER_FILE.filters.1.LogLevelMax=FATAL
log4cplus.appender.APPNDER_FILE.filters.1.AcceptOnMatch=true
log4cplus.appender.APPNDER_FILE.filters.2=log4cplus::spi::DenyAllFilter
log4cplus.rootLogger=DEBUG,APPNDER_FILE
这样能够生成最多2个日志文件,每个最多100M大小。TRACE~FATAL各种级别的日志都输出到同一个目录中,可以通过调整log4cplus.rootLogger=DEBUG,APPNDER_FILE中的DEBUG为其它级别,进行日志过滤。
把log4cplus集成在我的项目里面时,直接进行编译,会报如下错误:
是因为原项目是按X64平台编译的,而log4cplus没做更改,默认是win32。需把log4cplus改为x64重新编译。
更改后,又报error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1900”错误。
这是因为VS2015与VS2010的工具集不匹配,参见MSDN对这个错误的描述:
Visual Studio 定义以下符号防止链接不兼容的代码,这可能导致运行时错误或其他意外行为:
_MSC_VER
指示用于构造应用程序或库的 Visual C++ 编译器的主版本号和次版本号。代码编译使用 Visual C++ 编译器的一个版本,它与使用具有不同的主版本号和次版本号版本编译的代码不兼容。如果链接的库与您使用的 Visual C++ 编译器版本不兼容,您无法获取或生成库的兼容版本。可以使用编译器早期版本生成项目,更改项目的 平台工具集 属性。
解决方法是更改项目的平台工具集属性,要么把原项目的平台工具集改为v100,要么以VS2015打开log4cplus,并更改平台工具集为v140,重新编译。
我以VS2015打开log4cplus重新编译后,会产生很多无法解析的外部符号。
找了好久,原来问题仍然是兼容性上。
log4cplus使用的字符集是“使用多字节字符集”,而项目里面是“使用 Unicode 字符集”,需要在属性页-常规中更改为“使用 Unicode 字符”后重新编译。
至此,终于把log4cplus加到了项目中,日志效果:
可以简单的修改配置文件就能过滤日志级别,而且可以根据需要,按日志级别,把日志输出到不同的log中,而不是混在一起。也可以定义日志文件保留的个数和大小。
log4cplus还有很多强大功能,这个功能已经完美的解决了我的需求,it’s work!有同样需要的同学,只要修改下日志路径,根据需要的平台进行编译,相信也能快速使用的。