Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2333|回复: 1
打印 上一主题 下一主题

Log4Qt 使用笔记

[复制链接]

1272

主题

2067

帖子

7968

积分

认证用户组

Rank: 5Rank: 5

积分
7968
跳转到指定楼层
楼主
发表于 2018-2-24 14:09:27 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 Qter 于 2018-2-24 14:10 编辑

http://blog.csdn.net/dbzhang800/article/details/6916948

Log4Qt

Log4Qt 是Apache Log4J 的Qt移植版,所以看Log4J的资料应该是最直接有效的(因为Log4Qt的直接资料太少了)。

Log4Qt主要是用来记录日志(有助于程序调试)。有3个主要的组件:

Logger提供日志记录服务,可以有多个Logger存在,每个有它们自己的名字。Logger间存在隶属关系,有一个Logger称为根Logger。Appender用来指明将日志记录到什么地方:比如,控制台、文件、数据库,等等Layout控制日志的输出格式,可以类比一下C中的printf哈。例子一

一个简单的使用Log4Qt的Qt程序:(使用基础配置和根logger)

#include <QtCore>#include "logger.h"#include "basicconfigurator.h"int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    Log4Qt::BasicConfigurator::configure();    Log4Qt:ogger * log = Log4Qt:ogger::rootLogger();    log->debug("Hello DbZhang800!");    log->info("Hello Qt!");    log->warn("Hello 1+1=2");    return 0;}

结果如下:

16 [0x00a56708] DEBUG root  - Hello DbZhang800!16 [0x00a56708] INFO root  - Hello Qt!16 [0x00a56708] WARN root  - Hello 1+1=2例子二

稍微扩充一点,使用自己定义的logger

#include <QtCore>#include "logger.h"#include "basicconfigurator.h"class Object{    Log4Qt:ogger * logger;public:    Object() {        logger = Log4Qt:ogger::logger("Object");        logger->info("Constructor");    }    ~Object() {        logger->info("Destructor");    }};int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    Log4Qt::BasicConfigurator::configure();    Object obj;    return 0;}

结果:

0 [0x00a56708] INFO Object  - Constructor0 [0x00a56708] INFO Object  - Destructor

在类Object中,我们可以使用名为"Object"的Logger。恩,直接指定类名是可以的。可是我们现在在Qt下啊。Qt的元对象系统中包含类的名字,故尔我们可以直接使用。

例子三

用使用元对象系统,那么必须使用Q_OBJECT宏,然后我们从元对象系统获取类的名字,然后创建一个相应的logger就行了。

不过Log4Qt,既然是为Qt准备的,那么就要为Qt程序解忧嘛,也就是宏

LOG4QT_DECLARE_QCLASS_LOGGER

这个宏展开后成为该类的一个成员函数,返回一个Logger,我们就可以直接使用了:


#include <QtCore>#include "logger.h"#include "propertyconfigurator.h"class Object:public QObject{    Q_OBJECT    LOG4QT_DECLARE_QCLASS_LOGGERpublic:    Object(){logger()->info("constructor");}    ~Object(){logger()->info("destructor");}};#include "main.moc"int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    Log4Qt:ropertyConfigurator::configure(a.applicationDirPath() + "/log4qt.conf");    Object obj;    return 0;}

程序的输出结果如下:

2011-10-29 13:52:06 [Object]-[INFO] constructor2011-10-29 13:52:06 [Object]-[INFO] destructor

注意,本例中,我们没有使用默认配置,而是使用了一个配置文件log4qt.conf,放在了可执行程序所在目录下面

log4j.rootLogger=DEBUG,A1log4j.appender.A1=org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout=org.apache.log4j.PatternLayoutlog4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n

额,没错,里面的这些东西确实都是以log4j打头的,所以需要看log4j的手册来搞清楚这些东西:

  • 配置rootLogger,高于DEBUG的日志被输出,定义一个appender,取名为A1
  • 配置A1,输出到控制台
  • 设置A1采用的layout,并设置其具体格式
Log4j配置文件

我是不是太了解,简单整理一下:

配置根Logger

其语法

log4j.rootLogger = [level], appenderName1, appenderName2, ...

其中:

  • level 控制日志输出的级别:

OFF

关闭所有日志输出

FATAL

ERROR

建议使用的几个级别?,高于指定级别的日志才被输出

WARN

INFO

DEBUG

TRACE

ALL

所有日志均输出


  • appenderName 是appender的名字,指定输出到哪儿

注:除rootLogger外,还可以对各个logger分别设置

log4j.logger.myLogName = [level], appenderName1, appenderName2, ...配置Appender

语法

log4j.appender.appenderName = fully.qualified.name.of.appender.classlog4j.appender.appenderName.option1 = value1...log4j.appender.appenderName.optionN = valueN

name可以任意取,Log4j提供的appender有:

org.apache.log4j.ConsoleAppender

控制台

org.apache.log4j.FileAppender

文件

org.apache.log4j.DailyRollingFileAppender

每天产生一个日志文件

org.apache.log4j.RollingFileAppender

文件大小到达指定尺寸的时候产生一个新的文件


配置layout

语法

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.classlog4j.appender.appenderName.layout.option1 = value1…log4j.appender.appenderName.layout.optionN = valueN

其中:

log4j提供的layout有

org.apache.log4j.HTMLLayout

以HTML表格形式布局

org.apache.log4j.PatternLayout

可以灵活地指定布局模式

org.apache.log4j.SimpleLayout

包含日志信息的级别和信息字符串

org.apache.log4j.TTCCLayout

包含日志产生的时间、线程、类别等等信息


格式控制符:

%m

输出代码中指定的消息

%p

输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL

%c

输出logger的名字,通常就是所在类的全名

%n

输出一个回车换行符

%d

输出时间,默认格式为ISO8601,也可以指定格式,比如:%d{yyyy MMM dd HH:mm:ss},类似:2011年10月28日 14:10:28


参考
回复

使用道具 举报

1272

主题

2067

帖子

7968

积分

认证用户组

Rank: 5Rank: 5

积分
7968
沙发
 楼主| 发表于 2018-2-24 14:15:29 | 只看该作者
  1. #include "propertyconfigurator.h"
  2.          Log4Qt::PropertyConfigurator::configure(a.applicationDirPath() + "/log4qt.conf");
  3.          
  4.         log4j.rootLogger=DEBUG,A1
  5.         log4j.appender.A1=org.apache.log4j.ConsoleAppender
  6.         log4j.appender.A1.layout=org.apache.log4j.PatternLayout
  7.         log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
  8.        
  9.         或
  10.         Log4Qt::PropertyConfigurator::configure(a.applicationDirPath()+ "/log4j.properties");  
  11.        
  12.         #### Use two appenders, one to log to console, another to log to a file  
  13.         log4j.rootLogger=INFO,stdout,R1  
  14.         log4j.addivity.org.apache=true  
  15.           
  16.         #### First appender writes to console  
  17.         log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  18.         log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  19.           
  20.         # Pattern to output the caller's file name and line number.  
  21.         log4j.appender.stdout.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %-5p (%t) %c (%M:%L)] - %m%n  
  22.           
  23.         #### Second appender writes to a file  
  24.         log4j.appender.R1=org.apache.log4j.RollingFileAppender  
  25.         log4j.appender.R1.File=log/test.log  
  26.         # Control the maximum log file size  
  27.         log4j.appender.R1.MaxFileSize=1000KB  
  28.         # Archive log files (one backup file here)  
  29.         log4j.appender.R1.MaxBackupIndex=10  
  30.         log4j.appender.R1.layout=org.apache.log4j.PatternLayout  
  31.         log4j.appender.R1.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %-5p (%t) %c (%M:%L)] - %m%n
  32.        
  33.         或
  34.         //.cpp
  35.         Log4Qt::BasicConfigurator::configure();

  36.         Log4Qt::Logger *logger = Log4Qt::Logger::rootLogger();
  37.         logger->setLevel(Log4Qt::Level::NULL_INT);
  38.         logger->removeAllAppenders();
  39.         //FileAppender
  40.         Log4Qt::FileAppender *fileappender = new Log4Qt::FileAppender();
  41.         fileappender->setName("FileAppender");
  42.         QFileInfo fileinfo(QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss") + ".log");
  43.         fileappender->setFile(fileinfo.filePath());
  44.         Log4Qt::TTCCLayout *filelayout = new Log4Qt::TTCCLayout();//Log4Qt::TTCCLayout::DateFormat::ISO8601
  45.         filelayout->setDateFormat(QLatin1String("ISO8601"));
  46.         fileappender->setLayout(filelayout);
  47.         fileappender->activateOptions();
  48.         logger->addAppender(fileappender);
  49.         logger->info("info");
  50.         logger->warn("warn");
  51.         logger->error("error");
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-29 15:28 , Processed in 0.063010 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表