VS2015下Log4Cplus编译及其使用

来源:互联网 发布:淘宝买的电影票能退吗 编辑:程序博客网 时间:2024/06/03 13:25
主题 概要 项目实践 为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 <iostream>#include <string>#include <log4cplus/logger.h>#include <log4cplus/configurator.h> #include <log4cplus/layout.h> #include <log4cplus/loggingmacros.h> #include <log4cplus/helpers/stringhelper.h> #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.loglog4cplus.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::LogLevelRangeFilterlog4cplus.appender.APPNDER_FILE.filters.1.LogLevelMin=TRACElog4cplus.appender.APPNDER_FILE.filters.1.LogLevelMax=FATALlog4cplus.appender.APPNDER_FILE.filters.1.AcceptOnMatch=truelog4cplus.appender.APPNDER_FILE.filters.2=log4cplus::spi::DenyAllFilterlog4cplus.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!有同样需要的同学,只要修改下日志路径,根据需要的平台进行编译,相信也能快速使用的。

0 0