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目录中的文件就增加 ...
随机推荐
- [原创]基于Zynq Linux环境搭建(一)
安装VMWare版本12 Ubuntu版本 12.04.5 64bit 系统安装完成后,登陆系统,在sotfware中心安装konsole.gvim.software source等基本软件 在sof ...
- OpenSSL 提取 pfx 数字证书公钥与私钥
由于之前生产环境已经使用了 Identityserver4 用来做授权与认证的服务,而新项目采用 Spring Cloud 微服务体系,一方面 Spring Cloud 官方暂时只支持 OAuth2. ...
- Sqlserver 锁(转)
转载 http://www.cnblogs.com/zhouqianhua/archive/2011/04/15/2017049.html 总结: 锁的种类: 共享锁\排它锁\更新锁\意向锁\计 ...
- 设计模式学习之责任链模式(Chain of Responsibility,行为型模式)(22)
参考:http://www.cnblogs.com/zhili/p/ChainOfResponsibity.html 一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1 ...
- 向量 dot cross product 点积叉积 几何意义
向量 dot cross product 点积叉积 几何意义 有向量 a b 点积 a * b = |a| * |b| * cosθ 几何意义: 1. a * b == 0,则 a ⊥ b 2. a ...
- stm32位操作详解
stm32位操作详解 STM32位操作原理 思想:把一个比特分成32位,每位都分配一个地址,这样就有32个地址,通过地址直接访问. 位操作基础 位运算 位运算的运算分量只能是整型或字符型数据,位运算把 ...
- SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)
一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud config ...
- XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Peterhof
A. City Wall 找规律. #include<stdio.h> #include<iostream> #include<string.h> #include ...
- BZOJ5254 : [Fjwc2018]红绿灯
显然所有询问都要经过至少$\sum d$,只需要考虑除了$\sum d$之外的等待红灯的时间. 将所有询问的时间模$g+r$,并按时间用set维护. 那么对于每个红灯,在set中可以找出$1$到$2$ ...
- 明天开始学习 Hibernate
明天开始学 Hibernate ,想简单的了解一下 Hibernate,也借此机会了解一下 ORM 计划用 5 天的时间看完,包括整理笔记 加油吧,少年~~