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项目中的使用的更多相关文章

  1. cmake在实际复杂项目中的使用

    在实际复杂的项目之中,会有很多的源文件,以及对于库的依赖,如果直接使用makefile会比较的繁琐,而且makefile的推导规则也非常多,对多目录的支持也比较复杂. 最近看了一下cmake,发现配置 ...

  2. VS项目中使用Nuget还原包后编译生产还一直报错?

    Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...

  3. ABP项目中使用Swagger生成动态WebAPI

    本文是根据角落的白板报的<使用ABP实现SwaggerUI,生成动态webapi>一文的学习总结,感谢原文作者角落的白板报. 1 安装Swashbuckle.core 1.1 选择WebA ...

  4. iOS 之项目中遇到的问题总结

    昨天去一家公司面试,面试官问了我在项目开发中遇到过哪些问题,是什么引起的,怎样解决的? 当时由于有点小紧张只说出了一两点,现在就来好好总结一下. 问题: 1.两表联动 所谓的两表联动就是有左右两个表格 ...

  5. My97DatePicker时间控件在项目中的应用

    一.下载My97DatePicker的压缩包My97DatePicker.rar,解压. 注:My97DatePicker最新版本有开发包,项目中使用时删掉,以便节省空间,提高程序的运行效率. 二.在 ...

  6. 在项目中同时使用Objective-C和Swift

    苹果发布的Swift语言可以和之前的Objective-C语言同时存在于一个项目中. 可能有人会认为是同一个类文件中既可以有Objective-C也可以有Swift,这是不对的.同一个类文件或同一个代 ...

  7. 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持

    在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...

  8. 在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

    在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式 ...

  9. Web API项目中使用Area对业务进行分类管理

    在之前开发的很多Web API项目中,为了方便以及快速开发,往往把整个Web API的控制器放在基目录的Controllers目录中,但随着业务越来越复杂,这样Controllers目录中的文件就增加 ...

随机推荐

  1. highcharts的dataLabels如何去处阴影

    问题: 在使用highcharts生成的图标中dataLabels是有阴影的,通常是影响美观,那么如何去除阴影呢? 原因:是因为highcharts将dataLabels生成的标签是tspan,里面有 ...

  2. HBase总结 LSM理解

    转载的文章,觉得写的比较好 讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 哈希存储引擎  是哈希表的持久化实现,支持增.删.改以及随机读取操作,但不支持顺序扫描,对应的存储 ...

  3. python运算符——比较运算符

    比较运算符的运算结果会得到一个bool类型,也就是逻辑判定,要么是真True,要不就是False 大于“>”  小于“<”  不说了,看看不等于,用“!=”表示.大于等于“>=”和小 ...

  4. tar 压缩归档

    压缩归档 掌握归档的定义:归档(archiving)就是将许多文件(或目录)打包成一个文件. 了解归档的目的:归档的目的就是方便备份.还原及文件的传输操作. 掌握tar命令的功能:将多个文件(也可能包 ...

  5. 关于H5页面在iPhoneX适配

    ​1.  iPhoneX的介绍 屏幕尺寸 我们熟知的iPhone系列开发尺寸概要如下: △ iPhone各机型的开发尺寸 转化成我们熟知的像素尺寸: △ 每个机型的多维度尺寸 倍图其实就是像素尺寸和开 ...

  6. loadrunner之java user脚本开发

    脚本开发环境: loadrunner11.0 jdk1.6.32_x86_32 脚本开发 1.选择JavaVuser协议 2.配置java环境(Vuser--RunTime Settings) 3.开 ...

  7. Hashmap误区

    HashMap简介 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射.HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.Ser ...

  8. js 类数组对象arguments

    function Add() { for (var i = 0; i < arguments.length; i++) { console.log(arguments[i]); } } Add( ...

  9. HDU 2009 求数列的和

    题目链接:HDU 2009 Description 数列的定义如下: 数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和. Input 输入数据有多组,每组占一行,由两个整数n(n< ...

  10. Java try-cath-finally异常

    Java 内置异常类 Java 语言定义了一些异常类在 java.lang 标准包中. 标准运行时异常类的子类是最常见的异常类.由于 java.lang 包是默认加载到所有的 Java 程序的,所以大 ...