文件系统记录程序运行日志
定义日志的输出格式
#include <QReadWriteLock>
#include <QTextStream>
#include <QDateTime>
#include <QFile>
#define LOG_NAME_DEBUG "文件路径"
#define LOG_MAX_SIZE (200 * 1024 * 1024)
#define BAK_LOG_COUNT (10)
#define TRY_OPEN_FILE_COUNT (10)
static QFile g_logFile;
static QReadWriteLock glogLock;
static QTextStream out(&g_logFile);
static void openFile(const QString &fileName)
{
g_logFile.setFileName(fileName);
for (int i = 1; i <= TRY_OPEN_FILE_COUNT; ++i)
{
if (g_logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
{
break;
}
QString logInfo = "[" + QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss zzz") + "] " + fileName;
if (TRY_OPEN_FILE_COUNT != i)
{
fprintf(stderr, "%s open failed %d times, errmsg: %s. try again.", \
logInfo.toLatin1().data(), i, g_logFile.errorString().toLatin1().data());
}
else
{
fprintf(stderr, "%s open failed...", logInfo.toLatin1().data());
}
}
}
static void logBackup()
{
int suffix_number = 0;
if (BAK_LOG_COUNT == suffix_number)
{
suffix_number = 0;
}
QString backupName = LOG_NAME_DEBUG + QString("_") + QString::number(suffix_number);
++suffix_number;
if (!QFile::exists(backupName) || QFile::remove(backupName))
{
g_logFile.close();
if (!g_logFile.rename(backupName))
{
openFile(LOG_NAME_DEBUG);
return;
}
openFile(LOG_NAME_DEBUG);
}
}
void paMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QWriteLocker locker(&glogLock);
QString logInfo = "[" + QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss zzz") + "]";
switch (type) {
case QtDebugMsg:
logInfo.append(QString("Debug: \"%1\", (%2: %3, %4)\r\n").arg(msg)
.arg(context.file).arg(context.line).arg(context.function));
break;
case QtWarningMsg:
logInfo.append(QString("Warning: \"%1\", (%2: %3, %4)\r\n").arg(msg)
.arg(context.file).arg(context.line).arg(context.function));
break;
case QtCriticalMsg:
logInfo.append(QString("Critical: \"%1\", (%2: %3, %4)\r\n").arg(msg)
.arg(context.file).arg(context.line).arg(context.function));
break;
case QtFatalMsg:
logInfo.append(QString("Fatal: \"%1\", (%2: %3, %4)\r\n").arg(msg)
.arg(context.file).arg(context.line).arg(context.function));
abort();
}
if (out.status() != QTextStream::Ok)
{
QString timeContent = "[" + QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss zzz") + "][POWER] ";
fprintf(stderr, "%s QTextStream status error!!!", timeContent.toLatin1().data());
}
out << logInfo;
out.flush();
if (g_logFile.size() > LOG_MAX_SIZE)
{
logBackup();
}
}
void initLog()
{
openFile(LOG_NAME_DEBUG);
qInstallMessageHandler(paMessageOutput);
}