qt实现输出日志到指定文件的操作方法-kb88凯时官网登录

来自:网络
时间:2024-09-10
阅读:
免费资源网,https://freexyz.cn/

开发平台 :

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..
}
免费资源网,https://freexyz.cn/
返回顶部
顶部
网站地图