body, table{font-family: 微软雅黑; font-size: 10pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

笔者认为Appender是log4cpp中最精彩的一个部分。我仔细阅读了大部分Appender的源代码并对设计者感到非常敬仰。

Log4cpp中所有可直接使用的Appender列表如下:

log4cpp::IdsaAppender                          // 发送到IDS或者
log4cpp::FileAppender                     // 输出到文件
log4cpp::RollingFileAppender        // 输出到回卷文件,即当文件到达某个大小后回卷
log4cpp::OstreamAppender           // 输出到一个ostream类
log4cpp::RemoteSyslogAppender         // 输出到远程syslog服务器
log4cpp::StringQueueAppender          // 内存队列
log4cpp::SyslogAppender                    // 本地syslog
log4cpp::Win32DebugAppender        // 发送到缺省系统调试器
log4cpp::NTEventLogAppender           // 发送到win 事件日志

其中SyslogAppender和RemoteSyslogAppender需要与Syslog配合使用,因此这里不介绍。顺便提一句,Syslog是
类Unix系统的一个核心服务,用来提供日志服务,在Windows系统中并没有直接提供支持,当然可以用相关工具提供Windows系统中的
syslog服务。IdsaAppender的功能是将日志写入Idsa服务

(1)OstreamAppender

  在我刚刚学习C/C++编程时,一位老师告诉我,如果没有好用的调试工具,就在代码中加入printf语句,将调试信息打印出来(当时在linux下面,确实没有什么易用的c++调试工具)。现在有了OstreamAppender,一切都好办了,它可以将日志记入一个流,如果该流恰好是cout,则会在标准控制台上输出。比
printf优越的是,除了输出消息外,还可以轻松的输出时间、时钟数、优先级等大量有用信息。

  OstreamAppender的使用非常简单,在前面的HelloWorld程序中已经见过,创建一个OstreamAppender的具体方法如下:

log4cpp::OstreamAppender* osAppender = new log4cpp::OstreamAppender("osAppender", &cout);
//第一个参数指定OstreamAppender的名称,第二个参数指定它关联的流的指针。

(2) FileAppender和RollingFileAppender

FileAppender和RollingFileAppender是log4cpp中最常用的两个Appender,其功能是将日志写入文件中。它们之间唯一的区别就是前者会一直在文件中记录日志(直到操作系统承受不了为止),而后者会在文件长度到达指定值时循环记录日志,文件长度不会超过指定值(默认的指定值是10M byte)。

  FileAppender的创建函数如下:

 FileAppender(const std::string& name, const std::string& fileName,  bool append = true, mode_t mode = 00644);

******* 一般仅使用前两个参数,即“名称”和“日志文件名”。第三个参数指示是否在日志文件后继续记入日志,还是清空原日志文件再记录。第四个参数说明文件的打开方式。

    RollingFileAppender的创建函数如下:

 RollingFileAppender(const std::string& name,  
                     const std::string& fileName,
                     size_t maxFileSize = 10*1024*1024,
                     unsigned int maxBackupIndex = 1,
                     bool append = true,
                     mode_t mode = 00644);

它与FileAppender的创建函数很类似,但是多了两个参数:maxFileSize指出了回滚文件的最大值;maxBackupIndex指出了回滚文件所用的备份文件的最大个数。所谓备份文件,是用来保存回滚文件中因为空间不足未能记录的日志,备份文件的大小仅比回滚文件的最大值大1kb。所
以如果maxBackupIndex取值为3,则回滚文件(假设其名称是rollwxb.log,大小为100kb)会有三个备份文件,其名称分别是
rollwxb.log.1,rollwxb.log.2和rollwxb.log.3,大小为101kb。另外要注意:如果
maxBackupIndex取值为0或者小于0,则回滚文件功能会失效,其表现如同FileAppender一样,不会有大小的限制。这也许是一个
bug.

#include <iostream>
#include<sstream>
#include<log4cpp/Category.hh>
#include<log4cpp/PatternLayout.hh>
#include<log4cpp/FileAppender.hh>
#include<log4cpp/RollingFileAppender.hh>
#include<log4cpp/Priority.hh>
using namespace std;
using namespace log4cpp;
int main()
{
        //Layout与Appender是一对一的关系
        //Category与Appender是一对多的关系, 可以同时往两个Appender指定的文件写东西
//设置日志格式
        PatternLayout * ptnLy1=new PatternLayout();
        ptnLy1->setConversionPattern("%d: %p %c %x:%m%n");
        PatternLayout * ptnLy2=new PatternLayout();
        ptnLy2->setConversionPattern("%d: %p %c %x:%m%n");
//设置日志输出目的地
        FileAppender *pFileAppender=new FileAppender("fileAppender","mylog.log");
        pFileAppender->setLayout(ptnLy1);
//设置日志输出目的地,回滚文件大小,备份数量
        RollingFileAppender *pRollFileAppender=new RollingFileAppender("rollingFileAppender", "mylogrolling.log", 5*1024, 1);
        pRollFileAppender->setLayout(ptnLy2);
 
//设置输出日志
        Category & root=Category::getRoot().getInstance("rootCat");
        root.addAppender(pFileAppender);
        root.addAppender(pRollFileAppender);
        root.setPriority(Priority::DEBUG);
//写日志
        for(int idx=0;idx!=100;++idx)
        {
                ostringstream oss;
                oss<<idx<<":Root Error Message!";
                root.error(oss.str());
        }
//关闭Category
        Category::shutdown();
        return 0;
}
#include<iostream>
#include<string>
#include<sstream>
#include<log4cpp/Category.hh>
#include<log4cpp/Appender.hh>
#include<log4cpp/FileAppender.hh>
#include<log4cpp/RollingFileAppender.hh>
#include<log4cpp/PatternLayout.hh>
#include<log4cpp/Priority.hh>
using namespace std;
using namespace log4cpp;
int main(int argc,char **argv)
{
        //Layout与Appender是一对一的关系
        //Category与Appender是一对多的关系, 可以同时往两个Appender指定的文件写东西
        //设置日志的输出目的地,这里是两种不同的输出到文件的方式;
        FileAppender* fileAppender = new FileAppender("fileAppender","mylog.log");
        RollingFileAppender* rollingfileAppender = new RollingFileAppender(
        //设置输出目的地,回滚文件大小,备份数量
                        "rollingfileAppender","mylogrolling.log",5*1024,1);
        //设置日志格式
        PatternLayout* pLayout1 = new PatternLayout();
        PatternLayout* pLayout2 = new PatternLayout();
        pLayout1->setConversionPattern("%d: %p %c %x: %m%n");
        pLayout2->setConversionPattern("%d: %p %c %x: %m%n");
        fileAppender->setLayout(pLayout1);
        rollingfileAppender->setLayout(pLayout2);
        //设置输出日志
        Category& root = Category::getRoot().getInstance("RootName");
        root.addAppender(fileAppender);
        root.addAppender(rollingfileAppender);
        //写日志
        for(int i=0;i<100;i++)
        {
                string strError;
                ostringstream oss;
                oss<<i<<":Root Error Message!";
                strError = oss.str();
                root.error(strError);
        }
        //关闭日志
        Category::shutdown();
        return 0;
}

程序运行后会产生三个日志文件mylog.log和mylogrolling.log,以及一个备份文件mylogrolling.log.1。mylog.log的大小为6kb,记录了所有100条日志;mylogrolling.log大小为1kb,记录了最新的21条日志;mylogrolling.log.1大小为5kb,记录了旧的79条日志(这就是回卷文件)。

//mylog.log

//mylogrolling.log.1

log4cpp之Appender的更多相关文章

  1. log4cpp的初步使用

    (1)下载log4cpp的工程,编译生成lib文件和dll库 下载路径为:http://sourceforge.net/projects/log4cpp/files/latest/download 如 ...

  2. log4cpp基础测试

    // log4cplus.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" #include <iostream>#include ...

  3. C++之log4cpp库的使用

    log4..简介 log4..是基于log4j的一系列的c++移植版本,使用了log4j的模式结构,目前主要有以下几个版本: 1. log4cxx, 目前是到0.10.0版,Apache下的孵化项目, ...

  4. Log4cpp配置文件格式说明

    Log4cpp配置文件格式说明 博客分类: log4cpp log4cpp  log4cpp有3个主要的组件:categories(类别).appenders(附加目的地).和 layouts(布局) ...

  5. Log4cpp介绍及使用

    Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能.使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流.内存字符串队列.文件.回滚文件.调试器.Wind ...

  6. 快速使用Log4Cpp

    封了一下接口,快速使用. 其他的你都不用管了. 这里封装了需要读取外部conf文件配置输出项.否则可以用getInstance初始化日志类 #include "L4Cpp.h" v ...

  7. 【转】Log4cpp 封装

    [转自]http://blog.csdn.net/ylioi/article/details/9049591 这篇文章对Log4cpp使用了宏定义和类进行封装,非常有借鉴意义. log4cpp 是参考 ...

  8. 【转】 log4cpp 的使用

    [转自] http://sogo6.iteye.com/blog/1154315     Log4cpp配置文件格式说明   log4cpp有3个主要的组件:categories(类别).append ...

  9. 自定义Log4cpp的日志输出格式

    // 1. 实例化一个PatternLayout对象 log4cpp::PatternLayout* pLayout = new log4cpp::PatternLayout(); // 2. 实例化 ...

随机推荐

  1. redis数据持久化内存不足

    原因:写数据到redis里面写不进去,查看redis日志显示: Can't save in background: fork: Cannot allocate memory 在小内存的进程上做一个fo ...

  2. Phoenix编译支持CDH

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl/p/6898227.html 转载请注明出处 最近由于想调研下低延迟的数据查询框架,那么基于SQL on Hba ...

  3. 一个url加载的全过程

    最近在进行前端面试方面的一些准备,遇到了一个经典前端问题,一个url从输入到页面加载中间到底发生了什么,以前也认真想过这个问题,但是当时回答的都不全面,现在来好好总结一下: 总体来说分为以下六个步骤: ...

  4. 20145303刘俊谦 《Java程序设计》第三周学习总结

    20145303刘俊谦 <Java程序设计>第三周学习总结 教材学习内容总结 1.类与对象: 类:对现实生活中事物的描述,定义类时用关键词class 对象:这类事物实实在在存在的个体,利用 ...

  5. 20145322《Java程序设计》第4次实验报告

    实验内容 1.搭建Android环境 2.运行Android 3.修改代码并输出自己的学号 实验步骤 搭建Android环境 安装Android,核心是配置JDK.SDK 运行Android 最终结果 ...

  6. vscode调试pomelo和pomelo使用vscode调试

    使用vscode 通过端口remote attach进行调试 pomelo. 0. 网上好多调试pomelo的都是webstorm.或者vscode调试node的教程.但没找到vscode调试pome ...

  7. [CF911F]Tree Destruction

    题意翻译 给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少. 首先我们知道,到一个点距离最远的点是直径的端点.考虑贪心,如果我 ...

  8. centos redis 3.2.11 安装与配置

    centos 7 下载解压 wget http://download.redis.io/releases/redis-3.2.11.tar.gz tar xzf redis-3.2.11.tar.gz ...

  9. spring boot将jar包转换成war包发布

    spring boot将jar包转换成war包发布步骤 将<packaging>jar</packaging>修改为<packaging>war</packa ...

  10. 【cs231n】神经网络学习笔记1

    神经网络推荐博客: 深度学习概述 神经网络基础之逻辑回归 神经网络基础之Python与向量化 浅层神经网络 深层神经网络 前言 首先声明,以下内容绝大部分转自知乎智能单元,他们将官方学习笔记进行了很专 ...