开发平台 :
qt creator
语言:
c
需求:
- 获取日志信息,写入指定文件
- 日志7天后过期
- 保护写入日志进程
前置操作:
1.在cmakelists.txt中添加如下代码
# 添加预处理,防止在release模式下,输出的日志信息不显示文件名,行号等信息 add_definitions(-dqt_messagelogcontext)
2.创建logmanage.h 和 logmanage.cpp
具体代码:
logmanage.h
#pragma once #include#include #include #include #include //初始化 void initalizelog(); //获取日志存储目录路径 qstring getlogfilepath(); //日志处理 void logmessagehandler(qtmsgtype type,const qmessagelogcontext &context, const qstring &messages);
logmanage.cpp
#include "src/logmanage.h" #include#include #include #include #include void initalizelog() { //1. 预设日志目录并检查是否创建 qstring path = getlogfilepath(); qdir dir(path); if(!dir.exists()){ dir.mkdir(path); } //2. 日志7天后过期逻辑 qdatetime last_time = qdatetime::currentdatetime().adddays(-7); qfileinfolist infolist = dir.entryinfolist(); for(qfileinfo info : infolist){ if(info.filename() == "." || info.filename() == ".."){ continue; } if(last_time.secsto(info.birthtime()) < 0){//secsto: 差多少秒到 info.dir().remove(info.filename()); } } } void logmessagehandler(qtmsgtype type, const qmessagelogcontext &context, const qstring &message) { //1. 加锁,保护进程 static qmutex mutex;//互斥锁 qmutex mutex.lock(); //2. 日志信息生成及处理 /*** 1.日志消息类型 ***/ qstring m_type(""); switch (type) { case qtdebugmsg: m_type = qstring("debug"); break; case qtinfomsg: m_type = qstring("info"); break; case qtwarningmsg: m_type = qstring("warning"); break; case qtcriticalmsg: m_type = qstring("critical"); break; case qtfatalmsg: m_type = qstring("fatal"); break; } /*** 2.日志消息 ***/ qbytearray m_message = message.toutf8(); /*** 3.日志生成日期 ***/ qstring m_date = qdatetime::currentdatetime().tostring("yyyy-mm-dd hh:mm::ss"); /*** 4.日志所在文件&行 ***/ qstring m_file = context.file; int m_line = context.line; qstring m_log = qstring("[%1]-<文件:%2 所在行:%3 日期:%4> ----------------- %5") .arg(m_type).arg(m_file).arg(m_line).arg(m_date).arg(m_message); //3. 日志写入预设文件 qstring m_filepath = getlogfilepath(); qstring m_filename = qdate::currentdate().tostring("yyyy-mm-dd"); m_filename = ".txt"; m_filename = m_filepath "/" m_filename; m_filename = qdir::tonativeseparators(m_filename); qfile file(m_filename); file.open(qiodevice::readwrite | qiodevice::append); qtextstream stream(&file); stream<< m_log << "\r\n"; file.flush(); //直接将缓冲中的内容写入文件 file.close(); //4. 解锁 mutex.unlock(); } qstring getlogfilepath() { qstring str = qapp->applicationdirpath(); str = str.left(str.lastindexof("/")); str = "/mylog"; str = qdir::tonativeseparators(str);//tonativeseparators: 转到本地分隔符 return str; }
main.cpp
int main(int argc, char *argv[]) { //release模式下启动日志文件输出 #ifdef qt_no_debug initalizelog(); //自定义日志输出 qinstallmessagehandler(logmessagehandler); #endif //other.. //other.. //other.. //other.. }