话不多说,直接上代码
#include <QDebug>
#include <QMutex>
#include <QFileInfo>
static const int MAX_LOG_FILE_SIZE = 4 * 1024 * 1024;
void writeToFile(const QByteArray &log) {
static QMutex mutex;
mutex.lock();
QFile file(QCoreApplication::applicationDirPath() + "/logs/" + QString(APP_NAME) + ".log");
QFileInfo info(file);
if (file.open(QIODevice::ReadWrite | QIODevice::Append | QFile::Text)) {
QString currentTime = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz");
file.write("[" + currentTime.toUtf8() + "] - ");
file.write(log);
file.write("\n");
file.flush();
file.close();
if (info.size() > MAX_LOG_FILE_SIZE) {
auto data = file.readAll();
file.resize(0);
data = data.right(MAX_LOG_FILE_SIZE);
file.write(data);
file.flush();
file.close();
}
}
mutex.unlock();
}
void messageOutPut(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);
writeToFile(localMsg.constData());
break;
case QtInfoMsg:
fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
writeToFile(localMsg.constData());
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
writeToFile(localMsg.constData());
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
writeToFile(localMsg.constData());
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
writeToFile(localMsg.constData());
abort();
}
}
然后在main函数里添加代码
qInstallMessageHandler(messageOutPut);
messageOutPut是输出函数的名称,自己定义。