开源日志系统log4cplus(四)

将log信息记录到文件应该说是日志系统的一个基本功能,log4cplus在此基础上,提供了更多的功能,可以按照你预先设定的大小来决定是否转储,当超过该大小,后续log信息会另存到新文件中,依次类推;或者按照日期来决定是否转储。本文将详细介绍这些用法。

### 如何将log记录到文件 ###
我们在例5中给出了一个将log记录到文件的例子,用的是FileAppender类实现的,log4cplus提供了三个类用于
文件操作,它们是FileAppender类、RollingFileAppender类、DailyRollingFileAppender类。
1. FileAppender类
实现了基本的文件操作功能,构造函数如下:
FileAppender(const log4cplus::tstring& filename,
                     LOG4CPLUS_OPEN_MODE_TYPE mode = LOG4CPLUS_FSTREAM_NAMESPACE::ios::trunc,
                     bool immediateFlush = true);
                     
filename       : 文件名
mode           : 文件类型,可选择的文件类型包括app、ate、binary、in、out、trunc,因为实际上只是对
                 stl的一个简单包装,呵呵,这里就不多讲了。缺省是trunc,表示将先前文件删除。
immediateFlush :缓冲刷新标志,如果为true表示每向文件写一条记录就刷新一次缓存,否则直到FileAppender
                 被关闭或文件缓存已满才更新文件,一般是要设置true的,比如你往文件写的过程中出现
                 了错误(如程序非正常退出),即使文件没有正常关闭也可以保证程序终止时刻之前的所有
                 记录都会被正常保存。
FileAppender类的使用情况请参考例5,这里不再赘述。
2. RollingFileAppender类
构造函数如下:
log4cplus::RollingFileAppender::RollingFileAppender(const log4cplus::tstring& filename,
                                                    long maxFileSize,
                                                    int maxBackupIndex,
                                                    bool immediateFlush)
filename       : 文件名
maxFileSize    : 文件的最大尺寸
maxBackupIndex : 最大记录文件数
immediateFlush : 缓冲刷新标志
                                                    
RollingFileAppender类可以根据你预先设定的大小来决定是否转储,当超过该大小,后续log信息会另存到新
文件中,除了定义每个记录文件的大小之外,你还要确定在RollingFileAppender类对象构造时最多需要多少个
这样的记录文件(maxBackupIndex+1),当存储的文件数目超过maxBackupIndex+1时,会删除最早生成的文件,
保证整个文件数目等于maxBackupIndex+1。然后继续记录,比如以下代码片段:
    ... ...
    
    #define LOOP_COUNT 200000
    
    SharedAppenderPtr _append(new RollingFileAppender("Test.log", 5*1024, 5));
    _append->setName("file test");
    _append->setLayout( std::auto_ptr(new TTCCLayout()) );
    Logger::getRoot().addAppender(_append);
    Logger root = Logger::getRoot();
    Logger test = Logger::getInstance("test");
    Logger subTest = Logger::getInstance("test.subtest");
    for(int i=0; i    {
        NDCContextCreator _context("loop");
        LOG4CPLUS_DEBUG(subTest, "Entering loop #" << i)
    }
    
    ... ...
    ;>
运行结果:
运行后会产生6个输出文件,Test.log、Test.log.1、Test.log.2、Test.log.3、Test.log.4、Test.log.5
其中Test.log存放着最新写入的信息,而最后一个文件中并不包含第一个写入信息,说明已经被不断更新了。
需要指出的是,这里除了Test.log之外,每个文件的大小都是200K,而不是我们想像中的5K,这是因为
log4cplus中隐含定义了文件的最小尺寸是200K,只有大于200K的设置才生效,<= 200k的设置都会被认为是
200K.
3. DailyRollingFileAppender类
构造函数如下:
DailyRollingFileAppender::DailyRollingFileAppender(const log4cplus::tstring& filename,
                                                   DailyRollingFileSchedule schedule,
                                                   bool immediateFlush,
                                                   int maxBackupIndex)
                                                   
filename       : 文件名
schedule       : 存储频度
immediateFlush : 缓冲刷新标志
maxBackupIndex : 最大记录文件数
DailyRollingFileAppender类可以根据你预先设定的频度来决定是否转储,当超过该频度,后续log信息会另存
到新文件中,这里的频度包括:MONTHLY(每月)、WEEKLY(每周)、DAILY(每日)、TWICE_DAILY(每两天)、
HOURLY(每时)、MINUTELY(每分)。maxBackupIndex的含义同上所述,比如以下代码片段:
    ... ...
    
    SharedAppenderPtr _append(new DailyRollingFileAppender("Test.log", MINUTELY, true, 5));
    _append->setName("file test");
    _append->setLayout( std::auto_ptr(new TTCCLayout()) );
    Logger::getRoot().addAppender(_append);
    Logger root = Logger::getRoot();
    Logger test = Logger::getInstance("test");
    Logger subTest = Logger::getInstance("test.subtest");
    for(int i=0; i    {
        NDCContextCreator _context("loop");
        LOG4CPLUS_DEBUG(subTest, "Entering loop #" << i)
    }
    
    ... ...;>
运行结果:
运行后会以分钟为单位,分别生成名为Test.log.2004-10-17-03-03、Test.log.2004-10-17-03-04和
Test.log.2004-10-17-03-05这样的文件。
需要指出的是,刚看到按照频度(如HOURLY、MINUTELY)转储这样的概念,以为log4cplus提供了内部定时器,
感觉很奇怪,因为日志系统不应该主动记录,而loging事件总是应该被动触发的啊。仔细看了源代码后才知道
这里的"频度"并不是你写入文件的速度,其实是否转储的标准并不依赖你写入文件的速度,而是依赖于写入
的那一时刻是否满足了频度条件,即是否超过了以分钟、小时、周、月为单位的时间刻度,如果超过了就另存。
本部分详细介绍log信息的几种文件操作方式,下面将重点介绍一下如何有选择地控制log信息的输出。
时间: 2024-11-05 16:40:12

开源日志系统log4cplus(四)的相关文章

开源日志系统log4cplus(一)

log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工程中会比较专业的,:),本文介绍了log4cplus基本概念,以及如何安装,配置.  ### 简介 ### log4cplus是C++编写的开源的日志系统,前身是java编写的log4j系统.受Apache Software License 保护.作者是Tad E. Smith.log4cplus具有线程安全.灵活.以及多粒度控制的特点,通过将信息划分 优先级使其可以面向程序调试.运行.测试.和维护等全生命周期: 你可

开源日志系统log4cplus(五)

日志系统的另一个基本功能就是能够让使用者按照自己的意愿来控制什么时候,哪些log信息可以输出. 如果能够让用户在任意时刻设置允许输出的LogLevel的信息就好了,log4cplus通过LogLevelManager. LogLog.Filter三种方式实现了上述功能. ### 优先级控制 ### 在研究LogLevelManager之前,首先介绍一下log4cplus中logger的存储机制,在log4cplus中,所有 logger都通过一个层次化的结构(其实内部是hash表)来组织的,有一

开源日志系统log4cplus(三)

本文介绍了三种控制输出格式的布局管理器的概念和使用情况,通过掌握这些知识,可以更有效地控制log系统输出尽可能贴近你需求的信息来. ### 如何控制输出消息的格式 ### 前面已经讲过,log4cplus通过布局器(Layouts)来控制输出的格式,log4cplus提供了三种类型的Layouts, 分别是SimpleLayout.PatternLayout.和TTCCLayout.其中: 1. SimpleLayout 是一种简单格式的布局器,在输出的原始信息之前加上LogLevel和一个"-

开源日志系统log4cplus(七)

经过短暂的熟悉过程,log4cplus已经被成功应用到了我的项目中去了,效果还不错,:)除了上文提及的 功能之外,下面将介绍log4cplus提供的线程和套接字的使用情况. ### NDC ### 首先我们先了解一下log4cplus中嵌入诊断上下文(Nested Diagnostic Context),即NDC.对log系统而言, 当输入源可能不止一个,而只有一个输出时,往往需要分辩所要输出消息的来源,比如服务器处理来自不同 客户端的消息时就需要作此判断,NDC可以为交错显示的信息打上一个标记

开源日志系统log4cplus(二)

本文介绍了使用log4cplus有六个步骤,并提供了一些例子引导你了解log4cplus的基本使用. ### 基本使用 ### 使用log4cplus有六个基本步骤: 1. 实例化一个appender对象 2. 实例化一个layout对象 3. 将layout对象绑定(attach)到appender对象 4. 实例化一个logger对象,调用静态函数:log4cplus::Logger::getInstance("logger_name") 5. 将appender对象绑定(atta

Logback 1.0.1发布 开源日志系统

Logback 是一个作为log4j项目的继任者,是由Log4j的创始人Ceki Gulcu设计成一款开源日志系统. Logback 配备基本架构以通用于不同情况下的需求,它分为三个模块:Core module.Classic module 和 Access module.Core module核心模块是为其他两个模块设计的一个基础模块.Classic module类似于log4j的改进版本,实现了SLF4J API使你可以很容易地在logback和其它日志系统(log4j 或 JDK14 )之

开源日志系统比较

原文地址:http://www.cnblogs.com/ibook360/p/3159544.html 1. 背景介绍   许多公司的平台每天会产生大量的日志(一般为流式数据,如,搜索引擎的pv,查询等),处理这些日志需要特定的日志系统,一般而言,这些系统需要具有以下特征: (1) 构建应用系统和分析系统的桥梁,并将它们之间的关联解耦: (2) 支持近实时的在线分析系统和类似于Hadoop之类的离线分析系统: (3) 具有高可扩展性.即:当数据量增加时,可以通过增加节点进行水平扩展. 本文从设计

创业公司做数据分析(四)ELK日志系统

作为系列文章的第四篇,本文将重点探讨数据采集层中的ELK日志系统.日志,指的是后台服务中产生的log信息,通常会输入到不同的文件中,比如Django服务下,一般会有nginx日志和uWSGI日志.这些日志分散地存储在不同的机器上,取决于服务的部署情况了.如果我们依次登录每台机器去查阅日志,显然非常繁琐,效率也很低,而且也没法进行统计和检索.因此,我们需要对日志进行集中化管理,将所有机器上的日志信息收集.汇总到一起.完整的日志数据具有非常重要的作用: 信息查找.通过检索日志信息,定位相应的bug,

创业公司如何做数据分析(四)ELK日志系统

作为系列文章的第四篇,本文将重点探讨数据采集层中的ELK日志系统.日志,指的是后台服务中产生的log信息,通常会输入到不同的文件中,比如Django服务下,一般会有nginx日志和uWSGI日志.这些日志分散地存储在不同的机器上,取决于服务的部署情况了.如果我们依次登录每台机器去查阅日志,显然非常繁琐,效率也很低,而且也没法进行统计和检索.因此,我们需要对日志进行集中化管理,将所有机器上的日志信息收集.汇总到一起.完整的日志数据具有非常重要的作用: 信息查找.通过检索日志信息,定位相应的bug,