VS2015下Log4Cplus编译及其使用
来源:互联网 发布:淘宝买的电影票能退吗 编辑:程序博客网 时间:2024/06/03 13:25
项目背景
最近在做一个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!有同样需要的同学,只要修改下日志路径,根据需要的平台进行编译,相信也能快速使用的。
- VS2015下Log4Cplus编译及其使用
- C++(12):vs2015使用log4cplus
- VS2013下使用log4cplus
- mingw下使用vs2015编译器编译FFMPEG
- Windows下使用VS2015编译openssl库
- windows下使用log4cplus教程
- qt 下log4cplus的使用
- 使用VS2015编译FreeGLUT
- vs2015编译使用GRPC
- 使用log4cplus库,编译错误undefined reference to `log4cplus::Logger::Logger(log4cplus::Logger&&)'解决方法
- windows下使用VS2015编译V8 JavaScript引擎
- VS2015下编译 MONGODB 驱动
- Windows下vs2015编译Chromium
- VS2015下编译libeXosip2.5.0
- Windows下VS2015编译caffe
- Windows下 VS2015编译RocksDB
- windows下vs2015编译caffe
- VS2015下编译pixman-0.34
- 51nod1295 XOR key
- WCF安全机制之自定义账号密码
- 最长回文子串
- Javascript继承机制
- 初识python之简单方便及一些注意事项
- VS2015下Log4Cplus编译及其使用
- 详解神秘Linux内核
- ios 弹出框
- Android5.0 新特性--CardView
- ORM框架
- leetcode题解日练--2016.7.9
- Linux基础篇——信号
- 事务 Transation
- java基础二:创建方法、使用类(类成员)