转 开源日志库<log4cplus+VS2008使用>整理
一.简介
    log4cplus是C++编写的开源的日志系统,功能非常全面.本文介绍如何在Windows+VS2008中使用该日志库。
 
二.下载
    可从网站http://log4cplus.sourceforge.net上去下载 log4cplus 1.0.3 rc9,具体地址http://downloads.sourceforge.net/log4cplus/log4cplus-1.0.3-rc9.tar.bz2?use_mirror=nchc,同时附件也带有这个库。
 
三.配置环境
    1. 将库解压到C:\log4cplus下面,使用VS2008打开.\msvc8\log4cplus.sln,编译log4cplus_static(Debug_Unicode+Release_Unicode),并将生成的Lib(log4cplusUS.lib+log4cplusUSD.lib)复制到.\Lib目录下。
    2. 将.\Include和.\Lib分别添加到VS2008的搜索路径下。
    3. 在我们的工程中,添加预定义 LOG4CPLUS_STATIC。
    3. 只需要包含相应的头文件和链接相应的库就可以正常的使用log4cplus进行日志的管理了。
    4.注意编译的库和使用的程序,使用的CRT方式的一致,如下所示:
    
   
    5. 另外还可以使用动态链接的方式去使用log4cplus,这里不介绍了。
 
四.log4cplus框架
1.log4cplus基本元素
    Layouts       :控制输出消息的格式。
    Appenders  :输出位置。
    Logger         :日志对象。
    Priorities      :优先权,包括TRACE, DEBUG, INFO, WARNING, ERROR, FATAL。
 
2.log4cplus基本结构
    
3. 使用步骤:
    a.) 生成Appender对象。
    b.) 生成Layout对象,并绑定到Appender。(可选)
    c.) 生成Logger对象。
    d.) 设置Logger优先级。(可选)
    e.) 将需要关联Logger的Appender添加到Logger上。
    f.) 使用Logger输出信息,所有大于设定的优先级的信息,并在所有挂接在该Logger对象上的Appender上以相应的Layout设定的格式显示出来。
 
五.log4cplus内容介绍
1. Logger对象
    Logger对象具有层次结构,按名称区分,如下代码:   
Logger test = Logger::getInstance("test"); 
Logger subtest = Logger::getInstance("test.subtest");
    对象subtest是test的子对象。
 
2. 优先级
    log4cplus优先级有低到高:
    NOT_SET_LOG_LEVEL :接受缺省的LogLevel,如果有父logger则继承它的LogLevel
    ALL_LOG_LEVEL :开放所有log信息输出
    TRACE_LOG_LEVEL :开放trace信息输出(即ALL_LOG_LEVEL)
    DEBUG_LOG_LEVEL :开放debug信息输出
    INFO_LOG_LEVEL  :开放info信息输出
    WARN_LOG_LEVEL  :开放warning信息输出
    ERROR_LOG_LEVEL :开放error信息输出
    FATAL_LOG_LEVEL :开放fatal信息输出
    OFF_LOG_LEVEL :关闭所有log信息输出
 
    各个logger可以通过setLogLevel设置自己的优先级,当某个logger的LogLevel设置成NOT_SET_LOG_LEVEL时,该logger会继承父logger的优先级,另外,如果定义了重名的多个logger, 对其中任何一个的修改都会同时改变其它logger。
 
3.Layout格式输出
1.) SimpleLayout
    是一种简单格式的布局器,在输出的原始信息之前加上LogLevel和一个"-"。
 
2.) TTCCLayout
    其格式由时间,线程ID,Logger和NDC 组成。
 
3.) PatternLayout
    是一种有词法分析功能的模式布局器,类似正则表达式。以“%”作为开头的特殊预定义标识符,将产生特殊的格式信息。
 
(1)"%%",转义为% 。
(2)"%c",输出logger名称,如test.subtest 。也可以控制logger名称的显示层次,比如"%c{1}"时输出"test",其中数字表示层次。
(3)"%D",显示本地时间,比如:"2004-10-16 18:55:45",%d显示标准时间。     可以通过%d{...}定义更详细的显示格式,比如%d{%H:%M:%s}表示要显示小时:分钟:秒。大括号中可显示的
     预定义标识符如下:
     
   %a -- 表示礼拜几,英文缩写形式,比如"Fri"
   %A -- 表示礼拜几,比如"Friday"
   %b -- 表示几月份,英文缩写形式,比如"Oct"
   %B -- 表示几月份,"October"
   %c -- 标准的日期+时间格式,如 "Sat Oct 16 18:56:19 2004"
   %d -- 表示今天是这个月的几号(1-31)"16"
   %H -- 表示当前时刻是几时(0-23),如 "18"
   %I -- 表示当前时刻是几时(1-12),如 "6"
   %j -- 表示今天是哪一天(1-366),如 "290"
   %m -- 表示本月是哪一月(1-12),如 "10"
   %M -- 表示当前时刻是哪一分钟(0-59),如 "59"
   %p -- 表示现在是上午还是下午, AM or PM
   %q -- 表示当前时刻中毫秒部分(0-999),如 "237"
   %Q -- 表示当前时刻中带小数的毫秒部分(0-999.999),如 "430.732"
   %S -- 表示当前时刻的多少秒(0-59),如 "32"
   %U -- 表示本周是今年的第几个礼拜,以周日为第一天开始计算(0-53),如 "41"
   %w -- 表示礼拜几,(0-6, 礼拜天为0),如 "6"
   %W -- 表示本周是今年的第几个礼拜,以周一为第一天开始计算(0-53),如 "41"
   %x -- 标准的日期格式,如 "10/16/04"
   %   X -- 标准的时间格式,如 "19:02:34"
   %y -- 两位数的年份(0-99),如 "04"
   %Y -- 四位数的年份,如 "2004"
   %Z -- 时区名,比如 "GMT"
 
(4)"%F",输出当前记录器所在的文件名称,比如"main.cpp"
(5)"%L",输出当前记录器所在的文件行号,比如"51"
(6)"%l",输出当前记录器所在的文件名称和行号,比如"main.cpp:51"
(7)"%m",输出原始信息。
(8)"%n",换行符。
(9)"%p",输出LogLevel,比如"DEBUG"
(10)"%t",输出记录器所在的线程ID,比如 "1075298944"
(11)"%x",嵌套诊断上下文NDC (nested diagnostic context) 输出,从堆栈中弹出上下文信息,NDC可以用对不同源的log信息(同时地)交叉输出进行区分。
(12)格式对齐,比如"%-10m"时表示左对齐,宽度是10,当然其它的控制字符也可以相同的方式来使用,比如"%-12d","%-5p"等等。
 
4.) Appender输出位置
(1)控制台输出
        ConsoleAppender
(2)文件输出
        FileAppender / RollingFileAppender / DailyRollingFileAppender .
 
FileAppender :
    实现了基本的文件操作功能,构造函数如下:
    FileAppender(filename,mode,immediateFlush);
 
<filename > 文件名
<mode> 文件类型,可选择的文件类型包括app,ate,binary,in,out,trunc。缺省是trunc,表示将先前文件删除。
<immediateFlush> 缓冲刷新标志.
 
RollingFileAppender:
    RollingFileAppender(filename,maxFileSize,maxBackupIndex,immediateFlush)

filename       : 文件名
maxFileSize    : 文件的最大尺寸
maxBackupIndex : 最大记录文件数
immediateFlush : 缓冲刷新标志
    可以根据你预先设定的大小来决定是否转储,当超过该大小,后续log信息会另存到新文件中,除了定义每个记录文件的大小之外,你还要确定在RollingFileAppender类对象构造时最多需要多少个这样的记录文件(maxBackupIndex+1),当存储的文件数目超过maxBackupIndex+1时,会删除最早生成的文件,保证整个文件数目等于maxBackupIndex+1 。
 
DailyRollingFileAppender:
    DailyRollingFileAppender(filename, schedule,immediateFlush,  maxBackupIndex)

filename       : 文件名
schedule       : 存储频度
immediateFlush : 缓冲刷新标志
maxBackupIndex : 最大记录文件数

 
    DailyRollingFileAppender类可以根据你预先设定的频度来决定是否转储,当超过该频度,后续log信息会另存到新文件中,这里的频度包括:MONTHLY,WEEKLY,DAILY,TWICE_DAILY,HOURLY,MINUTELY。
 
六.测试代码
1. 一个基本框架的例子
//Include .h file 
#include <log4cplus/logger.h> 
#include <log4cplus/fileappender.h> 
#include <log4cplus/consoleappender.h> 
#include <log4cplus/layout.h>

using namespace log4cplus; 
using namespace log4cplus::helpers;

// Link Lib 
#ifndef _DEBUG 
#pragma comment(lib,"log4cplusUS.lib") 
#else 
#pragma comment(lib,"log4cplusUSD.lib") 
#endif

int _tmain(int argc, _TCHAR* argv[]) 
{    
        // 定义一个控制台的Appender 
        SharedAppenderPtr pConsoleAppender(new ConsoleAppender());

// 定义一个简单的Layout,并绑定到Appender 
        auto_ptr<Layout> pSimpleLayout(new SimpleLayout()); 
        pConsoleAppender->setLayout(pSimpleLayout);

// 定义Logger,并设置优先级 
        Logger pTestLogger = Logger::getInstance(_T("LoggerName"));    
        pTestLogger.setLogLevel(WARN_LOG_LEVEL);

// 将需要关联Logger的Appender添加到Logger上 
        pTestLogger.addAppender(pConsoleAppender);

// 输出日志信息 
        LOG4CPLUS_WARN(pTestLogger, "This is a <Warn> log message...");

return 0; 
}

运行结果,在控制台输出:
WARN - This is a <Warn> log message...
 
2.一个精简模式的例子
int _tmain(int argc, _TCHAR* argv[]) 

        // 定义一个控制台的Appender 
        SharedAppenderPtr pConsoleAppender(new ConsoleAppender());

// 定义Logger 
        Logger pTestLogger = Logger::getInstance(_T("LoggerName"));

// 将需要关联Logger的Appender添加到Logger上 
        pTestLogger.addAppender(pConsoleAppender);

// 输出日志信息 
        LOG4CPLUS_WARN(pTestLogger, "This is a <Warn> log message..."); 
        

        return 0; 
}
运行结果,在控制台输出:
WARN - This is a <Warn> log message...
 
3.输出更多的信息内容
int _tmain(int argc, _TCHAR* argv[]) 
        // 定义一个控制台的Appender 
        SharedAppenderPtr pConsoleAppender(new ConsoleAppender());

// 定义Logger 
        Logger pTestLogger = Logger::getInstance(_T("LoggerName"));

// 将需要关联Logger的Appender添加到Logger上 
        pTestLogger.addAppender(pConsoleAppender);

int n = 6 ; 
        TCHAR *p = _T("TestString") ;

// 输出日志信息 
        LOG4CPLUS_WARN(pTestLogger,"This is a <Warn> log message..."<<n<<" "<<p);

  return 0; 
}
运行结果,在控制台输出:
WARN - This is a <Warn> log message...6 TestString
 
4.输出到日志文件
int _tmain(int argc, _TCHAR* argv[]) 

        // 定义一个文件Appender 
        SharedAppenderPtr pFileAppender(new FileAppender(_T("d:\\testlog.log")));

// 定义Logger 
        Logger pTestLogger = Logger::getInstance(_T("LoggerName"));

// 将需要关联Logger的Appender添加到Logger上 
        pTestLogger.addAppender(pFileAppender);

// 输出日志信息 
        LOG4CPLUS_WARN(pTestLogger, "This is a <Warn> log message...");

return 0; 
}

运行结果,在文件 d:\\testlog.log 中 输出:
WARN - This is a <Warn> log message...
 
5.使用更多的格式控制
int _tmain(int argc, _TCHAR* argv[]) 

        // 定义1个控制台的Appender,3个文件Appender 
        SharedAppenderPtr pConsoleAppender(new ConsoleAppender()); 
        SharedAppenderPtr pFileAppender1(new FileAppender(_T("d:\\testlog1.log"))); 
        SharedAppenderPtr pFileAppender2(new FileAppender(_T("d:\\testlog2.log"))); 
        SharedAppenderPtr pFileAppender3(new FileAppender(_T("d:\\testlog3.log")));

// 定义一个简单的Layout,并绑定到 pFileAppender1 
        auto_ptr<Layout> pSimpleLayout(new SimpleLayout()); 
        pFileAppender1->setLayout(pSimpleLayout);

// 定义一个TTCLayout,并绑定到 pFileAppender2 
        auto_ptr<Layout> pTTCLayout(new TTCCLayout()); 
        pFileAppender2->setLayout(pTTCLayout);

// 定义一个PatternLayout,并绑定到 pFileAppender3 
        auto_ptr<Layout> pPatternLayout(new PatternLayout(_T("%d{%m/%d/%y %H:%M:%S}    - %m [%l]%n"))); 
        pFileAppender3->setLayout(pPatternLayout);

// 定义Logger 
        Logger pTestLogger = Logger::getInstance(_T("LoggerName"));

// 将需要关联Logger的Appender添加到Logger上 
        pTestLogger.addAppender(pConsoleAppender); 
        pTestLogger.addAppender(pFileAppender1); 
        pTestLogger.addAppender(pFileAppender2); 
        pTestLogger.addAppender(pFileAppender3);

// 输出日志信息 
        LOG4CPLUS_WARN(pTestLogger, "This is a <Warn> log message..."); 
         
        return 0; 
}

输出结果:
在控制台输出:
WARN - This is a <Warn> log message...
在 d:\testlog1.log 中输出:
WARN - This is a <Warn> log message...
在 d:\testlog2.log 中输出:
03-30-09 15:07:50,234 [1188] WARN LoggerName <> - This is a <Warn> log message...
在 d:\testlog3.log 中输出:
03/30/09 07:07:50  - This is a <Warn> log message... [e:\study\testcode\vs2008\testlog4cplus\testlog4cplus\testlog4cplus.cpp:121]
 
七.把设置移到配置文件中
    log4cplus通过PropertyConfigurator类实现了基于脚本配置的功能,通过脚本可以完成对logger、appender和layout的配置。
 
配置步骤:
1.配置Appender名称
枚举:
    log4cplus.appender.AppenderName1=log4cplus::ConsoleAppender
    log4cplus.appender.AppenderName2=log4cplus::FileAppender
    log4cplus.appender.AppenderName3=log4cplus::RollingFileAppender
    log4cplus.appender.AppenderName4=log4cplus::DailyRollingFileAppender
    log4cplus.appender.AppenderName5=log4cplus::SocketAppender
 
2.配置Layout
    可以选择不设置、TTCCLayout、或PatternLayout
    设置TTCCLayout如下所示:
        log4cplus.appender.AppenderName.layout=log4cplus::TTCCLayout
    设置PatternLayout如下所示:
        log4cplus.appender.AppenderName.layout=log4cplus::PatternLayout
        log4cplus.appender.append_1.layout.ConversionPattern=
                 %d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p - %m%n
 
3.配置Filter
    可选择的Filter: LogLevelMatchFilter,LogLevelRangeFilter和StringMatchFilter.
    对LogLevelMatchFilter来说,过滤条件包括LogLevelToMatch和AcceptOnMatch,只有当log信息的LogLevel值与LogLevelToMatch相同,且AcceptOnMatch为true时才会匹配。
    对LogLevelRangeFilter来说,过滤条件包括LogLevelMin、LogLevelMax和AcceptOnMatch,只有当log信息的LogLevel在LogLevelMin、LogLevelMax之间同时AcceptOnMatch为true时才会匹配。
    对StringMatchFilter来说,过滤条件包括StringToMatch和AcceptOnMatch,只有当log信息的LogLevel值与StringToMatch对应的LogLevel值与相同,且AcceptOnMatch为true时会匹配。
 
4.配置Logger
    对于RootLogger,如:
        log4cplus.rootLogger=[LogLevel], appenderName, appenderName, ...

    对于non-root logger来说:
    log4cplus.logger.logger_name=[LogLevel|INHERITED], appenderName, ...
 
5.加载配置
    PropertyConfigurator::doConfigure("cfg_filename");
 
6.举例:
a.) 对Appender对象进行配置,包括设置Appende名称,Layout和Filter及相关参数。
    设置Appender名称及参数,如:
    log4cplus.appender.AppenderName=log4cplus::FileAppender
    log4cplus.appender.AppenderName.File=d:\testlog.log
 
    设置Layout及参数,如:
    log4cplus.appender.AppenderName.layout=log4cplus::PatternLayout
    log4cplus.appender.AppenderName.layout.ConversionPattern=
              %d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p - %m%n
 
    设置Filter及参数,如:
    log4cplus.appender.AppenderName.filters.1=log4cplus::spi::LogLevelRangeFilter
    log4cplus.appender.AppenderName.filters.1.LogLevelMin=DEBUG
    log4cplus.appender.AppenderName.filters.1.LogLevelMax=INFO
    log4cplus.appender.AppenderName.filters.1.AcceptOnMatch=true
    log4cplus.appender.AppenderName.filters.2=log4cplus::spi::DenyAllFilter
      
b.) 设置Logger对象
    log4cplus.rootLogger=TRACE,AppenderName1,AppenderName2
   
c.) 将以上配置保存到文件中,比如:d:\log4clpus.cfg 中,并如何使用:
int _tmain(int argc, _TCHAR* argv[]) 

        PropertyConfigurator::doConfigure(_T("d:\\log4cplus.cfg"));

Logger logger = Logger::getRoot(); 
    
        LOG4CPLUS_DEBUG(logger, "This is a DEBUG message");         
        LOG4CPLUS_INFO(logger, "This is a INFO message");         
        LOG4CPLUS_WARN(logger, "This is a WARN message");         
        LOG4CPLUS_ERROR(logger, "This is a ERROR message");         
        LOG4CPLUS_FATAL(logger, "This is a FATAL message");

return 0; 
}

 

[转]开源日志库<log4cplus+VS2008使用>整理的更多相关文章

  1. 开源日志库log4cplus+VS2008使用

    一.简介     log4cplus是C++编写的开源的日志系统,功能非常全面.本文介绍如何在Windows+VS2008中使用该日志库.   二.下载     可从网站[url]http://log ...

  2. 爆料喽!!!开源日志库Logger的剖析分析

    导读 Logger类提供了多种方法来处理日志活动.上一篇介绍了开源日志库Logger的使用,今天我主要来分析Logger实现的原理. 库的整体架构图 详细剖析 我们从使用的角度来对Logger库抽茧剥 ...

  3. 爆料喽!!!开源日志库Logger的使用秘籍

    日志对于开发来说是非常重要的,不管是调试数据查看.bug问题追踪定位.数据信息收集统计,日常工作运行维护等等,都大量的使用到.今天介绍著名开源日志库Logger的使用,库的地址:https://git ...

  4. 使用C++日志库log4cplus

    用vs2015编译log4cplus,新建工程使用该库的时候出现连接错误,错误原因如下所述: 编译unicode版,可以正常使用了.

  5. Android开源日志库Logger的使用

    https://blog.csdn.net/Power_Qyh/article/details/78159598?locationNum=2&fps=1 https://github.com/ ...

  6. C++的开源跨平台日志库glog学习研究(一)

    作为C++领域中为数不多的好用.高效的.跨平台的日志工具,Google的开源日志库glog也算是凤毛麟角了.glog 是一个C++实现的应用级日志记录框架,提供了C++风格的流操作. 恰巧趁着五一我也 ...

  7. Logan:美团点评的开源移动端基础日志库

    前言 Logan是美团点评集团移动端基础日志组件,这个名称是Log和An的组合,代表个体日志服务.同时Logan也是“金刚狼”大叔的名号,当然我们更希望这个产品能像金刚狼大叔一样犀利. Logan已经 ...

  8. 大量Python开源第三方库资源分类整理,含菜鸟教程章节级别链接

    Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明.因其具有丰富和强大的库,它常被称为胶水语言,能够把用其它语言制作的各种模块(尤其是C/C ...

  9. C++的开源跨平台日志库glog学习研究(三)--杂项

    在前面对glog分别做了两次学习,请看C++的开源跨平台日志库glog学习研究(一).C++的开源跨平台日志库glog学习研究(二)--宏的使用,这篇再做个扫尾工作,算是基本完成了. 编译期断言 动态 ...

随机推荐

  1. Log中关于zVideoApp与zChatApp之间的消息传递可以搜索以下字符串

    [CSSBConfIPCAgent::OnMessageReceived]  (这是zVideoApp端的) 和 [CSSBPTIPCListener::OnMessageReceived]      ...

  2. 【笔记】AJAX基础

    [笔记]AJAX基础 Django AJAX  知识储备:JSON 什么是 JSON JSON 是轻量级的文本数据交换格式 JSON 独立于语言和平台.JSON 解析器和 JSON 库支持许多不同的编 ...

  3. 使用scp命令,远程上传下载文件/文件夹

    1.从服务器下载文件 scp username@servername:/path/filename /local/path例如: scp ubuntu@117.50.20.56:/ygf/data/d ...

  4. mysql使用常见问题

    常见问题之一: 启动mysql时显示: The server quit without updating PID file 1.可能是/usr/local/mysql/data/mysql.pid文件 ...

  5. (转)MySql数据库4【命令行赋权操作】

    MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户 原文:http://www.cnblogs.com/zhuyibo/p/3980328.html 一.g ...

  6. 哪些网站需要HTTPS(SSL证书)

    很多站长似乎不了解https站点是怎么回事,这就要从传统站点说起:传统的站点的http超文本传输协议,采用明文传输模式,存在着大量的灰色中 间环节,明文信息在中间代理服务器.路由器.wifi热点.通信 ...

  7. 使用HTML+CSS实现鼠标划过的二级菜单栏

    先上效果图: 1.鼠标没在上面 2.鼠标放在一级菜单上,展开二级菜单 3.鼠标放在二级菜单上 代码: (点击此处预览代码效果) <html> <head> <title& ...

  8. Prinzipien der Computer Zusammensetzung

    1.Die Einfuerung der Computer System 1.1 Computer Zusammensetzung und Computer Architektur Unter Com ...

  9. Scrum 冲刺博客第八篇

    一.当天站立式会议照片一张 二.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中 昨天已完成的工作 对界面进行美化 今天计划完成的工作 连接数据库实现排行榜的基本功能 工作中 ...

  10. CSS3 图标神器 => content:"我是特殊符号"

    基本形状 ▲ 9650 25B2 ► 9658 25BA ► 9658 25BA ▼ 9660 25BC ◄ 9668 25C4 ❤ 10084 2764 ✈ 9992 2708 ★ 9733 260 ...