log4cplus入门

转载http://wgwang.github.com/tech/misc/log4cplustutorial.html#id8

介绍

log4cplus是log4j的c++移植版,是c++中一个很好的打印日志的库。它与另外一个c++的log库log4cxx相比较,好处是不依赖于libapr和libaprutil,可以静态链接到程序中,便于部署。

当前的最新稳定版本是1.04,也是下面的例子中所用到的版本。

从这个版本中所了解到的,log4cplus并未完全实现了log4j,不少细节部分都没有实现。但这并不妨碍我们使用它。

下面是一些log4cplus资源:

编译

log4cplus没有太复杂的依赖关系,编译器来很简单,一般情况下使用默认情况即可。有一点可以提一下,如果不想将编译好的库安装在默认路径下,可以在./configure的时候加入参数: –prefix=/the/path/you/want/to/install/the/log4cplus

实例

需求

以一个典型的需求(笔者的经历)简单实现一个例子。需求是这样的:

  • 用文件配置
  • 自动切割日志,按小时切割
  • 保留8天日志(更长时间的日志会转移到其他专门的日志服务器上)
  • 指定输出的日志格式(便于日志分析)

配置

下面是整理好的配置文件,命名为:log.properties,内容如下:

log4cplus.rootLogger=TRACE, R

log4cplus.appender.R=log4cplus::DailyRollingFileAppender
log4cplus.appender.R.File=./log/test.log
log4cplus.appender.R.MaxBackupIndex=192 #8 * 24
log4cplus.appender.R.Schedule=HOURLY
log4cplus.appender.R.Append=true
log4cplus.appender.R.layout=log4cplus::PatternLayout
log4cplus.appender.R.layout.ConversionPattern=%p %D{%Y-%m-%d %H:%M:%S.%q} %i:%t %F:%L "%m"%n

程序

简单的示例程序如下:

#include <cstdlib>
#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/helpers/stringhelper.h>

using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;

int main()
{

    PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log.properties"));
    Logger logger = Logger::getRoot();

// trace
    LOG4CPLUS_TRACE(logger, "trace and get the fingerprint: " << "random integer: "<< random());

// debug
    LOG4CPLUS_DEBUG(logger, "this is debug log: " << "random integer: "<< random());

// info
    LOG4CPLUS_INFO(logger, "the information centry...." << "[ 1 + 1 = " << 1 + 1 << "]");

// warn
    LOG4CPLUS_WARN(logger, "Writing warning messages to log....");

// error
    LOG4CPLUS_ERROR(logger, "ooooooh, there is an error....");

//fatal
    LOG4CPLUS_FATAL(logger, "oh, my god! the fatal error occur!!!!!!!!!");

    return 0;
}

配置说明

  • 文件配置

    log4cplus提供一个类【PropertyConfigurator】来实现从文件读取配置,参数就是文件名。其他参数采用默认。

  • 按时间切割日志,需要在配置文件中配置appender为【DailyRollingFileAppender】,对应的一个参数是文件名,可以用程序启动时的相对路径,不过绝对路径会更好。

  • 按小时切割日志,以及保留8天,体现在配置文件中为如下两个参数:

    • log4cplus.appender.R.MaxBackupIndex=192 #8 * 24
    • log4cplus.appender.R.Schedule=HOURLY
  • 最后,是一个用来配置日志输出格式的配置项,如下:

    • log4cplus.appender.R.layout=log4cplus::PatternLayout
    • log4cplus.appender.R.layout.ConversionPattern=%p %D{%Y-%m-%d %H:%M:%S.%q} %i:%t %F:%L “%m”%n

    日志格式的说明,见后面的附录资源。

  • 配置项的第一行【log4cplus.rootLogger=TRACE, R】会跟cpp代码一起来区别不同的logger和日志输出级别,分别说明如下:

    • 选择logger

      Logger logger = Logger::getRoot(); 这个用来选择rootLogger的,其他的还可以配置更多的logger,一般情况下不是很需要。

    • 日志输出级别 TRACE

      这个可以控制日志输出,如在debug环境中,输出各种debug信息,而在线上环境中,则只需要输出info和各类错误信息。log4cplus支持如下日志级别,使用方法可以看cpp代码。

      • TRACE
      • DEBUG
      • INFO
      • WARN
      • ERROR
      • FATAL

      上述各种级别中,从上往下,重要性依次递增。而在配置文件中的级别会屏蔽掉比它重要性更低的日志输出。

    • 日志文件名:当前版本不支持对后面日期格式的配置,日期格式是硬编码到程序中的。对于按小时切割日志格式的,文件为配置的文件名后附加“.yyyy-mm-dd-HH”。另外,在一个小时内多次启动程序,会在其后增加“.1”,“.2”……等,并不会append到同一个文件中,这点不是太好。

程序说明

使用方式见上述的示例代码即可。两点说明下:

  • 如【LOG4CPLUS_FATAL】这类的宏,可以重新用宏定义为自己熟悉的方式
  • log4cplus的日志输出是用c++的stream的方式,用<<符号输出不同的字段。对于喜欢用c string format方式的话,需要在其上封装一层。

附录

其他appender

log4cplus还支持如下一些打印日志的方式(appender):

  • RollingFileAppender:按文件大小切分日志
  • SocketAppender:把日志打印到网络socket中,适合实时日志分析等。另外应该支持将日志同时打印到本地文件和socket中,这样可以实现本地正常打印日志,网络来做实时统计等。
  • ConsoleAppender: 打印日志到标准输出

原文链接: https://www.cnblogs.com/linmzh/archive/2013/01/11/2856095.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    log4cplus入门

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/75243

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午4:52
下一篇 2023年2月9日 下午4:55

相关推荐