log4cpp之Layout布局

26 篇文章 1 订阅
7 篇文章 0 订阅

许多程序员心中理想的格式,应该是这样的:

[2009-07-24 15:59:55,703] INFO : system is running
[2009-07-24 15:59:55,703] WARN : system has a warning
[2009-07-24 15:59:55,703] ERROR : system has a error, can’t find a file
[2009-07-24 15:59:55,718] FATAL : system has a fatal error, must be shutdown
[2009-07-24 15:59:55,718] INFO : system shutdown, you can find some information in system log

PatternLayout

  在介绍PatternLayout以前,首先来看看log4cpp中所有的Layout子类(Layout本身是个虚类),一共三个:BasicLayout、PatternLayout和SimpleLayout,其中SimapleLayout并不建议使用,而BaiscLayout过于简单,因此如果程序员不自己扩展Layout的话,就只能使用PatternLayout了,值得庆幸的是,PatternLayout还是比较好用的。

PatternLayout使用setConversionPattern函数来设置日志的输出格式。该函数的声明如下:

void log4cpp::PatternLayout::setConversionPattern  
(  const std::string &conversionPattern   )  throw (ConfigureFailure)

其中参数类型为std::string,类似于C语言中的printf,使用格式化字符串来描述输出格式,其具体含义如下:

%c  category;
%d  日期;日期可以进一步的设置格式,用花括号包围,例如%d{%H:%M:%S,%l} 或者 %d{%d %m %Y %H:%M:%S,%l}。如果不设置具体日期格式,则如下默认格式被使用“Wed Jan 02 02:03:55 1980”。日期的格式符号与ANSI C函数strftime中的一致。但增加了一个格式符号%l,表示毫秒,占三个十进制位。
%m  消息;
%n  换行符,会根据平台的不同而不同,但对于用户透明;
%p  优先级;
%r  自从layout被创建后的毫秒数;
%R  从1970年1月1日0时开始到目前为止的秒数;
%u  进程开始到目前为止的时钟周期数;
%x  NDC。

因此,要得到上述的理想格式,可以将setConversionPattern的参数设置为“%d: %p %c %x: %m%n”,其具体含义是“时间: 优先级 Category NDC: 消息 换行”。

log.h

#include <log4cpp/Category.hh>
#include <log4cpp/Appender.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/RollingFileAppender.hh>


static log4cpp::Category &root = log4cpp::Category::getRoot().getInstance("LOG");


class CLog
{
public:
    CLog(string file, int size);
    virtual ~CLog();

public:
    void    error(const char* formatstring, ...);
    void    warn(const char* formatstring, ...);
    void    info(const char* formatstring, ...);

private:
    void    log_init();
    void    log_close();

private:
    string  log_file;
    int     log_size;
    char    log_buf[6*K_SIZE];
};

log.cpp

#include "log.h"


/*static member*/ 
//nothing to do


/*
 * CLog::CLog()
 */
CLog::CLog(string file, int size) :
    log_file ( file ), 
    log_size ( size )
{
    memset(log_buf, 0x0, sizeof(log_buf));

    log_init();
}


/*
 * CLog::~CLog()
 */
CLog::~CLog()
{
    log_close();
}


/*
 * CLog::log_init()
 */
void CLog::log_init()
{
    log4cpp::PatternLayout* pLayout2 = new log4cpp::PatternLayout();
    pLayout2->setConversionPattern("[%d] %p %c %x: %m%n");


    log4cpp::RollingFileAppender* rollfileAppender = new log4cpp::RollingFileAppender(
        "rollfileAppender", log_file, log_size, 1);
    rollfileAppender->setLayout(pLayout2);


    root.addAppender(rollfileAppender); //使用滚动的方式记录日志
}


/*
 * CLog::log_close()
 */
void CLog::log_close()
{
    log4cpp::Category::shutdown();
}


/*
* CLog::error()
*/
void CLog::error(const char* formatstring, ...)
{
    int nLen = 0;

    memset(log_buf, 0, 6 * K_SIZE);

    va_list args;
    va_start(args, formatstring);
    nLen = vsnprintf(log_buf, sizeof(log_buf) - 1, formatstring, args);
    va_end(args);


    if (nLen <= 0 || nLen > (6 * K_SIZE - 1))
        nLen = sizeof(log_buf) - 1;
    log_buf[nLen] = '\0';

    string log_info(log_buf);
    root.error(log_info);

    return;
}


/*
* CLog::warn()
*/
void CLog::warn(const char* formatstring, ...)
{
    //do something
}

/*
* CLog::info()
*/
void CLog::info(const char* formatstring, ...)
{
    //do something
}

test.cpp

#include "log.h"

int main()
{
    string file ("test.log");
    int size = 100;
    CLog dras_log (file, size);
    //dras_log.log_init();

    int i = 0;
    for (i = 0; i < 5; i++)
    {
        dras_log.error("%02d-%s", i, "Hello!This is a test program!");
        dras_log.warn("%02d-%s", i, "Hello!This is a test program!");
        dras_log.info("%02d-%s", i, "Hello!This is a test program!");
    }

    return 0;
}

结果生成滚动日志文件,test.log && test.log.1。
日志格式:
[2017-03-03 16:05:27,960] ERROR LOG : 04-Hello!This is a test program!
[2017-03-03 16:05:27,960] WARN LOG : 04-Hello!This is a test program!
[2017-03-03 16:05:27,960] INFO LOG : 04-Hello!This is a test program!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值