Qt::日志处理

 

 // 自定义消息处理
 qInstallMessageHandler(comfunc::myMessageOutput);

 

void comfunc::myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    //修改日志消息内容
    QString logMsg = msg;
    if(logMsg.simplified().length() == 0) //过滤掉空消息
    {
        return;
    }
    if(logMsg[0] =='\"' && logMsg[logMsg.size()-1] == '\"')
    {
        logMsg = logMsg.mid(1,logMsg.length()-2);//去除消息中的冒号
    }

    QString logType;
    switch(type)
    {
        case QtDebugMsg:
             logType = QString("DEBUG");
             break;

        case QtInfoMsg:
             logType = QString("INFO");
             break;

        case QtWarningMsg:
             logType = QString("WARN");
             break;

        case QtCriticalMsg:
             logType = QString("ERROR");
             break;

        case QtFatalMsg:
             logType = QString("Fatal");
             break;

        default:
             logType = QString("UNKNOWN");
             break;
    }

    QString current_Date_Time = QDateTime::currentDateTime().toString("MM/dd hh:mm:ss.zzz");

    QString message = QString("%1|%2|%3|%4|%5\n").arg(current_Date_Time).arg(logType).arg(context.function).arg(context.line).arg(logMsg);

    //生成日志文件
    static QMutex mutex;    //添加互斥锁,便于在多线程情况的使用
    mutex.lock();             //加锁
    QDir::setCurrent(QCoreApplication::applicationDirPath());//设置当前目录
    static QString LogName = "./mylog.log";
    QFile file(LogName);
    if(file.size() >= 100*1024*1024)//如果日志文件超过100M,则另写一个
    {
        file.rename(LogName, LogName+QDateTime::currentDateTime().toString("_yyyyMMddhhmmss.log"));
        file.setFileName(LogName);
    }

    if(file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
    {
        QTextStream text_stream(&file);
        text_stream << message;
        file.flush();//将任何缓存数据刷新到文件中
        file.close();
    }

    mutex.unlock();    //解锁
}

 

posted @ 2021-02-03 23:20  osbreak  阅读(161)  评论(0编辑  收藏  举报