Qt中自定义日志输出格式,并写入文件

1.重写方法

using namespace std;

//日志代码互斥锁

QMutex logMutex;

QString timePoint;

void LogMsgOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)

{

   logMutex.lock();

   QByteArray localMsg = msg.toLocal8Bit();

   QString log;

   //日志时间戳

   log.append(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss "));

   switch (type) 

   {

       case QtDebugMsg:

       {

           log.append(QString("Debug: %1(FILE: %2:%3, FUNCTION: %4)

").arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function));

           break;

        }

       case QtInfoMsg:

       {

           log.append(QString("Info: %1(FILE: %2:%3, FUNCTION: %4)

").arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function));

           break;

        }

        case QtWarningMsg:

        {

            log.append(QString("Warning: %1(FILE: %2:%3, FUNCTION: %4)

").arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function));

            break;

         }

         case QtCriticalMsg:

         {

             log.append(QString("Critical: %1(FILE: %2:%3, FUNCTION: %4)

").arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function));

             break;

          }

         case QtFatalMsg:

         {

            log.append(QString("Fatal: %1(FILE: %2:%3, FUNCTION: %4)

").arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function));

            break;

          }

      }

   QDir tempDir;

   if (!tempDir.exists("./log"))

   {

       qDebug() << "log dir not exist" << endl;

       tempDir.mkpath("./log");

   }

   QFile file;

   QString path = QString("./log/%1.log").arg(timePoint);

   file.setFileName(path);

   if (!file.open(QIODevice::ReadWrite | QIODevice::Append))

   {

       QString erinfo = file.errorString();

       cout << erinfo.toStdString() << endl;

       return;

    }

    QTextStream out(&file);

    out << log << "\n\r";

    file.flush();

    file.close();

    logMutex.unlock();

}

2.在main函数中安装自定义的方法

    timePoint = QDateTime::currentDateTime().toString("yyyy-MM-dd_HH_mm_ss");

    qInstallMessageHandler(LogMsgOutput);

 

注意:

1)在编译release版本的时候日志文件中部分内容会为空,比如文件名、函数名和文件行数,因为Qt默认会去掉相关信息,解决方法是在pro文件中添加宏定义 DEFINES += QT_MESSAGELOGCONTEXT,如果是VS开发环境在配置项的C++预编译器中添加此宏,release版本的日志中就会有相关信息

2)在自定义日志handler中的qDebug不会有日志写入文件,因为一旦允许这样操作就会陷入无穷递归,所以上面代码中判断日志文件夹是否存在时的 qDebug() << "log dir not exist" << endl;不会在日志文件中出现,可参考Qt源文件qlogging.cpp的实现和说明

Qt ,可以使用 QDebug 和 qInstallMessageHandler 函数将日志写入文件。具体步骤如下: 1. 创建一个 QFile 对象,用于写入日志文件。例如: ```cpp QFile file("log.txt"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; ``` 2. 定义一个自定义的消息处理函数,用于将日志信息写入文件。例如: ```cpp void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) { QByteArray localMsg = msg.toLocal8Bit(); switch (type) { case QtDebugMsg: fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtInfoMsg: fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtWarningMsg: fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtCriticalMsg: fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtFatalMsg: fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); abort(); } QTextStream out(&file); out << QString("[%1] %2\n").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(msg); out.flush(); } ``` 该函数将日志信息按照指定的格式写入文件。 3. 在 main 函数调用 qInstallMessageHandler 函数,将自定义的消息处理函数设置为全局的消息处理函数。例如: ```cpp int main(int argc, char *argv[]) { QApplication a(argc, argv); QFile file("log.txt"); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return -1; qInstallMessageHandler(myMessageOutput); // ... return a.exec(); } ``` 这样,所有的日志信息都会被重定向到 log.txt 文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值