首页 > 学院 > 开发设计 > 正文

log4cpp之Layout布局

2019-11-06 08:10:17
字体:
来源:转载
供稿:网友

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

[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!


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表