关于 QLog 的 1234 那点事

QLog 是 QDAC 项目中包含的日志记录模块,提供了一个高性能、可扩展、简单易用的日志记录功能。

QLog 的日志架构层级如下图所示:

QLog

  • TQLog :日志记录的大管家

TQLog 负责:

  1. 缓存要记录的日志内容;
  2. 为外部日志记录提供接口;
  3. 管理日志广播对象,用于广播日志到不同的输出对象;

默认情况下,QLog 创建了一个全局的默认实例 Logs,以简化大家的编程。编程时只需要简单的包含 qlog 单元,然后就可以直接来访问相关的属性和方法了。

说到这里,TQLog 提供了以下属性:

  1. 日志记录模式属性 Mode 指明是同步还是异步日志记录模式;
  2. 日志广播对象实例属性 Castor 来方便用户添加新的输出对象;
  3. 统计属性 Count 来记录总的日志记录数, Flushed 来记录已经输出完成的记录数,两者的差就是缓存的数量了。

TQLog 提供 PostLog 方法来记录日志,当然你如果是向默认的 Logs 输出日志,直接调用全局的 PostLog 或 AddLog(C++)方法即可。如果你创建了多个 TQLog 实例,那么,你就需要调用不同的实例来区分日志。

  • TQLogCastor:日志输出的宣传大师

TQLogCastor 正如其名,是一个负责将日志广播到每个 TQLogWriter 对象的宣传大师。它负责管理日志输出对象,并调用 TQLogWriter.WriteItem 方法将日志输出到不同的目标中。TQLogCastor 本身是一个后台线程,所以它在输出日志时,不会影响系统中其它线程的执行。

  • TQLogWriter:默默无闻的实干家

TQLogWriter 是所有不同的输出日志对象的基类,提供虚拟方法封装以便供 TQLogCastor 调用。默认情况下,QLog 提供了三种不同的输出对象:

  1. TQLogConsoleWriter:输出日志到控制台,这个控制台在 Windows 下可以认为是 IDE 的 EventLog,在 Android 下是 Logcat,在 iOS 和 OSX 中是管理控制台。具体参考前面的文章。
  2. TQLogFileWriter : 输出日志到文件,这个文件输出类,自动提供历史日志打包压缩功能,方便管理。输出的日志格式为文本文件,可以直接用文本编辑器打开查看。
  3. TQLogSocketWriter:输出日志到远程,这个网络输出类使用 syslogd 协议,支持 UDP 和 TCP 协议。而接收协议端可以任何兼容 syslogd 协议的日志服务器。

要实现自己的日志记录目标,重载 TQLogWriter 然后继承并实现相关的方法即可。

QLog 还提供了一个 TQLogReader 的封装,用于实现日志阅读器,但并不同有实现任何子类(目前的几个 Writer 都不需要单独实现一个 Reader),如果有兴趣,您可以自己实现一个。

下面是设置不同输出日志目标的写法:

  • 输出日志到文件
SetDefaultLogFile(日志文件名,日志分卷大小,是否重命名历史日志文件);
  • 输出日志到远程服务器
Logs.Castor.Add(TQLogSocketWriter.Create(远程主机地址,远程主机端口,是否使用TCP协议));
  • 输出日志到控制台
Logs.Castor.AddWriter(TQLogConsoleWriter.Create);

这里我们说明一点,你可以同时设置多个日志记录目标,日志是被分别按顺序写入到每一个目标中的。

在程序中需要记录日志的地方,只需要简单的一句 PostLog 即可(C+++ 用 AddLog):

PostLog(日志级别,日志字符串内容,[日志参数]);

【最佳实践】

在调试程序时,应使用同步的日志记录模式,以保证在出错前,日志已经被输出到目标以便发现问题。但是,同步日志记录由于IO的效率问题,一般会对程序的运行效率产生比较大的影响,所以我们在程序发布时,应尽量使用异步日志的记录模式,以降低对程序性能的影响。

分享到: