log4cplus在VS项目中的使用
log4cplus是C++编写的开源的日志系统,宣称具有线程安全、灵活、以及多粒度控制的特点,通过将日志划分优先级使其可以面向程序调试、运行、测试、和维护等全生命周期。你可以选择将日志输出到屏幕、文件、甚至是远程服务器;通过指定策略对日志进行定期备份等等(该段为引用其他文章)。
1.编译log4cplus库
在网上下载log4cplus库(我下载了 log4cplus-1.2.1.zip) ,解压后在 msvc10 目录下由vs的工程 .sln文件,使用VS打开(我用vs2013),

打开和工程包含内容如上,其中log4cplus为动态库工程,log4cplusS为动态库工程,可以根据需要进行编译(我测试了静态库动态库都可以正常使用)。编译完成后如下目录会产生.lib、.dll文件(只有编译动态库时产生.dll)。

头文件在 \log4cplus_1.2.1\include 目录下
接下来就可以在自己的工程中引用该库了(关于引用动态库静态库的方法此处不赘述,《dll、lib编译与加载》中有描述)
2.log4cplus的初级应用
配置文件 logconfig.property
配置文件1
#RootLogger配置格式:log4cplus.rootLogger=[LogLevel],appenderName1,appenderName2,...,如此处LogLevel为DEBUG,appenderName1为 rootLogger
log4cplus.rootLogger=DEBUG,rootLogger #设置日志追加到文件尾
log4cplus.appender.rootLogger=log4cplus::RollingFileAppender
#log4cplus.appender.rootLogger=log4cplus::ConsoleAppender #设置直接在控制台输出
#设置日志文件大小
log4cplus.appender.rootLogger.MaxFileSize=100MB
#设置生成日志最大个数
log4cplus.appender.rootLogger.MaxBackupIndex=2
#设置输出日志路径
log4cplus.appender.rootLogger.File=rootLogger.log
log4cplus.appender.rootLogger.layout=log4cplus::PatternLayout
#设置日志打印格式
log4cplus.appender.rootLogger.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
#设置日志级别范围
log4cplus.appender.rootLogger.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.rootLogger.filters.1.LogLevelMin=TRACE
log4cplus.appender.rootLogger.filters.1.LogLevelMax=FATAL
log4cplus.appender.rootLogger.filters.1.AcceptOnMatch=true
log4cplus.appender.rootLogger.filters.2=log4cplus::spi::DenyAllFilter
#=====================================================================================
log4cplus.logger.test=DEBUG,test
log4cplus.appender.test=log4cplus::RollingFileAppender
log4cplus.appender.test.File=test.log
log4cplus.appender.test.layout=log4cplus::PatternLayout
log4cplus.appender.test.layout.ConversionPattern=%D:%d{%Q}|%p|%t|%l|%m|%n
log4cplus.appender.test.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.test.filters.1.LogLevelMin=TRACE
log4cplus.appender.test.filters.1.LogLevelMax=FATAL
log4cplus.appender.test.filters.1.AcceptOnMatch=true
log4cplus.appender.test.filters.2=log4cplus::spi::DenyAllFilter
log4cplus.appender.test.MaxFileSize=100MB
log4cplus.appender.test.MaxBackupIndex=2 #如何防止自定义的logger和root重复写入日志
log4cplus.additivity.test=false
test
#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/layout.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/helpers/stringhelper.h>
#pragma comment(lib, "..\\..\\log4cplus_1.2.1\\msvc10\\Win32\\bin.Debug\\log4cplusSD.lib") #define MY_LOG_FILE_PATH "E:\\VS_test\\threads\\threads2\\logconfig.property" //配置文件路径 int main(int argc, char *argv[])
{
log4cplus::initialize(); //初始化日志
log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(MY_LOG_FILE_PATH)); //读取配置文件
log4cplus::Logger logger = log4cplus::Logger::getRoot(); //根记录器始终被实例化并可用。它的名字是"root" LOG4CPLUS_FATAL(logger, "DeleteService failed,errCode=[" << << "]"); //打印级别为FATAL的日志
LOG4CPLUS_DEBUG(logger, " Service is removed"); //打印级别为DEBUG的日志 system("pause");
return ;
}
结果
-- :::841.235|FATAL||e:\vs_test\threads\threads2\main.cpp:|DeleteService failed,errCode=[]|
-- :::852.238|DEBUG||e:\vs_test\threads\threads2\main.cpp:| Service is removed|
3.封装一个简单的类,配置文件用上文中的 配置文件1 (以下忘记在哪里复制的,如有侵权敬请联系删除)
MyLogger.h
#ifndef Logger_H
#define Logger_H #include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/layout.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/helpers/stringhelper.h> #ifdef WIN32
#include <windows.h>
#pragma comment(lib, "..\\..\\log4cplus-1.2.1\\msvc10\\Win32\\bin.Debug\\log4cplusSD.lib")
unsigned CharToTchar(const char * _char, TCHAR * tchar)
{
if (nullptr == _char || nullptr == tchar)
return ;
int iLength;
iLength = MultiByteToWideChar(, , _char, strlen(_char) + , NULL, );
MultiByteToWideChar(, , _char, strlen(_char) + , tchar, iLength);
return ;
}
#else
#endif #define MY_LOG_FILE_PATH "..\\src\\logconfig.property" class MyLogger
{
private:
MyLogger()
{
log4cplus::initialize();
log4cplus::PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT(MY_LOG_FILE_PATH));
rootLog = log4cplus::Logger::getRoot();
char test[] = "test"; #ifdef WIN32
TCHAR tTest[];
unsigned uRet = CharToTchar(test, tTest); if ( == uRet)
logger_1 = log4cplus::Logger::getInstance(tTest);
#else
logger_1 = log4cplus::Logger::getInstance(test);
#endif }
~MyLogger()
{
if (m_logger)
{
delete m_logger;
}
} static MyLogger* m_logger; public:
static MyLogger * getInstance()
{
if (m_logger == NULL)
{
m_logger = new MyLogger();
}
return m_logger;
} log4cplus::Logger rootLog;
log4cplus::Logger logger_1; }; MyLogger* MyLogger::m_logger = NULL; #endif //Logger_H
main.cpp
#include "MyLogger.h" int main(int argc, char *argv[])
{
MyLogger * myLoger = NULL;
myLoger = MyLogger::getInstance(); LOG4CPLUS_FATAL(myLoger->rootLog, "DeleteService failed,errCode=[" << << "]");
LOG4CPLUS_DEBUG(myLoger->rootLog, " Service is removed"); LOG4CPLUS_DEBUG(myLoger->logger_1, " Service "); system("pause");
return ;
}
log4cplus在VS项目中的使用的更多相关文章
- cmake在实际复杂项目中的使用
在实际复杂的项目之中,会有很多的源文件,以及对于库的依赖,如果直接使用makefile会比较的繁琐,而且makefile的推导规则也非常多,对多目录的支持也比较复杂. 最近看了一下cmake,发现配置 ...
- VS项目中使用Nuget还原包后编译生产还一直报错?
Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...
- ABP项目中使用Swagger生成动态WebAPI
本文是根据角落的白板报的<使用ABP实现SwaggerUI,生成动态webapi>一文的学习总结,感谢原文作者角落的白板报. 1 安装Swashbuckle.core 1.1 选择WebA ...
- iOS 之项目中遇到的问题总结
昨天去一家公司面试,面试官问了我在项目开发中遇到过哪些问题,是什么引起的,怎样解决的? 当时由于有点小紧张只说出了一两点,现在就来好好总结一下. 问题: 1.两表联动 所谓的两表联动就是有左右两个表格 ...
- My97DatePicker时间控件在项目中的应用
一.下载My97DatePicker的压缩包My97DatePicker.rar,解压. 注:My97DatePicker最新版本有开发包,项目中使用时删掉,以便节省空间,提高程序的运行效率. 二.在 ...
- 在项目中同时使用Objective-C和Swift
苹果发布的Swift语言可以和之前的Objective-C语言同时存在于一个项目中. 可能有人会认为是同一个类文件中既可以有Objective-C也可以有Swift,这是不对的.同一个类文件或同一个代 ...
- 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持
在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...
- 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入
在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...
- Web API项目中使用Area对业务进行分类管理
在之前开发的很多Web API项目中,为了方便以及快速开发,往往把整个Web API的控制器放在基目录的Controllers目录中,但随着业务越来越复杂,这样Controllers目录中的文件就增加 ...
随机推荐
- C#学习-子类的初始化顺序
使用了继承之后,当我们初始化一个子类时,除了会调用子类的构造函数外,同时也会调用基类的构造函数. 子类的初始化顺序如下: (1)初始化类的实例字段: (2)调用基类的构造函数: (3)调用子类的构造函 ...
- 在macOS下使用MAXPP搭建本地开发服务器简易流程
本文适用于解决前端开发时所需的服务器支持,包括文件上传和下载.在开发环境中需要保持尽量的开放,并不是安全的.根据浏览器安全协议,所下载的开源项目是不能直接在file中直接打开的,需要把文件放置在服务器 ...
- Failed global initialization:FileNotOpen: Failed to open "C:\MongoDB\data\log\mongo.log" 安装MongoDB时卡死
在安装MongoDB的时候,下载了3.6版本,安装过程中发现到一半就卡死了,后面换了一个较低版本的才安装成功 这里是所有MongoDB版本的下载地址: https://www.mongodb.org/ ...
- 后端for循环补充
我们的for循环里面,在外面可以调用它最后一次循环的值,pycharm尽管会飘黄色,但是系统是可以识别出来的,能够调用,而且是循环最后一次的值
- php替换字符串函数strtr()和str_repalce()区别
php中替换函数主要有strtr(),str_repalce()这两个函数,但你们都知道他们这两个函数的区别和用法吗? 先来看看这个php字符串替换函数 strtr()的两种用法: strtr(str ...
- day10_friest_自动化
一.知识回顾, 1.构造函数:def __del__(self)是类执行完后,需要将某些如连接等关闭,可将关闭代码写在该函数中,既是实例被销毁的时候执行 2.私有寒素:def __say(self)表 ...
- Docker ElK安装部署使用教程
一.简介 1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引 ...
- chrome浏览器另存为/上传附件崩溃
x 前言 系统中有一个需要上传导入的功能,此功能在谷歌浏览器上传总是直接崩溃, 但是在火狐浏览器中就是好的. 自己想到的解决方案 谷歌浏览器版本号得问题?自己系统得问题? 谷歌浏览器卸载重新安装,还是 ...
- django创建命令及配置
创建项目django-admin startproject XXX(项目名字)运行项目 python manage.py runserver创建子应用python manage.py startapp ...
- SIM7600C读写本机号码
1 先发送AT+CPBS = "ON",表示要操作的是本机号码区域,而不是SIM的电话本 2 写入命令AT+CPBW=1,"1234567" 3 读取命令AT+ ...