VS2015下Log4Cplus编译及其使用

主题 概要
项目实践 为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。根据默认的属性编译,顺利编译成功。
VS2015下Log4Cplus编译及其使用_第1张图片
在Win32/bin.Debug目录下多出三个库文件:
log4cplusSD.lib,log4cplusD.lib和log4cplusD.dll。
VS2015下Log4Cplus编译及其使用_第2张图片
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集成在我的项目里面时,直接进行编译,会报如下错误:
VS2015下Log4Cplus编译及其使用_第3张图片
是因为原项目是按X64平台编译的,而log4cplus没做更改,默认是win32。需把log4cplus改为x64重新编译。
VS2015下Log4Cplus编译及其使用_第4张图片

更改后,又报error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1900”错误。

VS2015下Log4Cplus编译及其使用_第5张图片

这是因为VS2015与VS2010的工具集不匹配,参见MSDN对这个错误的描述:

Visual Studio 定义以下符号防止链接不兼容的代码,这可能导致运行时错误或其他意外行为:
_MSC_VER
指示用于构造应用程序或库的 Visual C++ 编译器的主版本号和次版本号。代码编译使用 Visual C++ 编译器的一个版本,它与使用具有不同的主版本号和次版本号版本编译的代码不兼容。如果链接的库与您使用的 Visual C++ 编译器版本不兼容,您无法获取或生成库的兼容版本。可以使用编译器早期版本生成项目,更改项目的 平台工具集 属性。
解决方法是更改项目的平台工具集属性,要么把原项目的平台工具集改为v100,要么以VS2015打开log4cplus,并更改平台工具集为v140,重新编译。

VS2015下Log4Cplus编译及其使用_第6张图片

我以VS2015打开log4cplus重新编译后,会产生很多无法解析的外部符号。

VS2015下Log4Cplus编译及其使用_第7张图片

找了好久,原来问题仍然是兼容性上。
log4cplus使用的字符集是“使用多字节字符集”,而项目里面是“使用 Unicode 字符集”,需要在属性页-常规中更改为“使用 Unicode 字符”后重新编译。

VS2015下Log4Cplus编译及其使用_第8张图片

至此,终于把log4cplus加到了项目中,日志效果:

这里写图片描述

可以简单的修改配置文件就能过滤日志级别,而且可以根据需要,按日志级别,把日志输出到不同的log中,而不是混在一起。也可以定义日志文件保留的个数和大小。

log4cplus还有很多强大功能,这个功能已经完美的解决了我的需求,it’s work!有同样需要的同学,只要修改下日志路径,根据需要的平台进行编译,相信也能快速使用的。

你可能感兴趣的:(工程实践)