DTK日志管理RollingFileAppender
前言
在 DTK日志管理DLogManager讲了DTK默认的日志管理器DLogManager,它提供了一个默认的实现,特别适合编写deepin或者uos应用。
但是如果我们需要对日志输出做自定义配置怎么办呢?比如配置单个日志文件的大小、回滚日志文件的个数等。
DTK提供的RollingFileAppender类可以完成这样的自定义。实际上DLogManager使用的就是RollingFileAppender。
简介
顾名思义,RollingFileAppender就是一个提供回滚的日志文件存储类。
RollingFileAppender自定义
自定义日志文件路径
文件路径通过RollingFileAppender构造函数传入:
auto rollingFileAppender = new RollingFileAppender(mylogPath);
需要注意两点:
- 这里的日志文件路径是日志文件的路径,而不是日志目录
- 日志目录(传入的日志文件路径的父目录)需要自己创建,RollingFileAppender不负责创建目录,只负责写日志文件
自定义日志文件格式
rollingFileAppender->setFormat(myformat)
默认的日志格式是:
"%{time}{yyyy-MM-dd, HH:mm:ss.zzz} [%{type:-7}] [%{file:-20} %{function:-35} %{line}] %{message}\n"
格式自定义的自由度很大,简单看下支持的内容:
- 时间
需要输出时间可以加上%{time}
,如果还需要自定义时间的格式,可以在后面加上{}里面写上时间格式,比如%{time}{dd-MM-yyyy, HH:mm}
,时间格式字符串参考QDateTime。 - 日志级别
日志级别有四种输出格式
– 大驼峰的格式%{type}
,例如:DEBUG级别输出Debug
– 大写的格式%{Type}
,例如:DEBUG级别输出DEBUG
– 小写的首字母%{typeOne}
,例如:DEBUG级别输出d
– 大写的首字母%{TypeOne}
,例如:DEBUG级别输出D
- 源文件名称
输出源文件名称有两种格式:
– 输出全路径%{File}
– 仅输出文件名%{file}
- 行号
行号就是%{line}
- 函数名称
函数名称有两种格式
– 输出完成完整函数信息%{Function}
,
– 仅输出函数名%{function}
,去掉返回值类型、参数列表、模板参数 - 日志内容
日志内容对应%{message}
- log category
%{category}
,这个暂时不明白是啥,有大佬知道可以说下 - 应用程序名称
添加%{appname}
- 进程id
添加%{pid}
- 线程id
添加%{threadid}
以上就是所有支持自定义的内容,另外,上面每一项设置字符串输出宽度和对齐方式,比如%{file:-20}
就是右对齐,不足20个字符填充空格。
自定义日志文件大小
默认是20M,可以修改为10M,如下:
rollingFileAppender->setLogSizeLimit(1024 * 1024 * 10)
自定义滚动频率
默认是每天滚动一次,可以修改为每周滚动一次,如下:
rollingFileAppender->setDatePattern(RollingFileAppender::WeeklyRollover);
另外,如果单个文件大小超过限制,即使没到滚动时机,也会滚动。
滚动频率有以下几种:
滚动频率 | 备注 |
---|---|
RollingFileAppender::MinutelyRollover | 每分钟滚动一次 |
RollingFileAppender::HourlyRollover | 每小时滚动一次 |
RollingFileAppender::HalfDailyRollover | 每半天滚动一次 |
RollingFileAppender::DailyRollover | 每天滚动一次 |
RollingFileAppender::WeeklyRollover | 每周滚动一次 |
RollingFileAppender::MonthlyRollover | 每月滚动一次 |
RollingFileAppender使用
以上讲了如何创建RollingFileAppender进行自定义,那自定义的RollingFileAppender对象如何集成到日志系统中了,这里需要用到Dtk::Core::Logger
,它是一个DTK提供的单例日志操作类,通过registerAppender
方法将RollingFileAppender对象配置到日志系统中:
logger->registerAppender(rollingFileAppender);
举例:
#include <Logger.h>
DCORE_USE_NAMESPACE
void initLogSystem()
{
auto logPath = "~/Desktop/logTest";
if (!QDir(logPath ).exists()){
QDir(logPath ).mkpath(logPath );
}
auto rollingFileAppender = new RollingFileAppender(logPath+ "/test.log");
rollingFileAppender ->setFormat("%{time}{yyyy-MM-dd, HH:mm:ss.zzz} [%{type:-7}] [%{file:-20} %{function:-35} %{line}] %{message}\n");
rollingFileAppender ->setLogFilesLimit(4);
rollingFileAppender->setLogSizeLimit(1024 * 1024 * 10)
rollingFileAppender ->setDatePattern(RollingFileAppender::WeeklyRollover );
logger->registerAppender(rollingFileAppender );
}