1
0
mirror of https://github.com/jaredtao/TaoQuick.git synced 2025-01-19 20:22:56 +08:00
2020-08-27 09:19:56 +08:00

154 lines
4.9 KiB
C++

#include "logger.h"
#include "loggertemplate.h"
#include <QCoreApplication>
#include <QDateTime>
#include <QDir>
#include <QMutex>
#include <QDebug>
#include <QTextStream>
#include <string>
#ifdef Q_OS_WIN
#include <Windows.h>
#else
#include <cstdio>
#endif
namespace Logger
{
static QString gLogDir;
static int gLogMaxCount;
static void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg);
static void outputMessageAsync(QtMsgType type, const QMessageLogContext& context, const QString& msg);
void initLog(const QString &logPath, int logMaxCount, bool async)
{
if (async)
{
qInstallMessageHandler(outputMessageAsync);
}
else
{
qInstallMessageHandler(outputMessage);
}
gLogDir = QCoreApplication::applicationDirPath() + QStringLiteral("/") + logPath;
gLogMaxCount = logMaxCount;
QDir dir(gLogDir);
if (!dir.exists())
{
dir.mkpath(dir.absolutePath());
}
QStringList infoList = dir.entryList(QDir::Files, QDir::Name);
while (infoList.size() > gLogMaxCount)
{
dir.remove(infoList.first());
infoList.removeFirst();
}
}
static void outputMessageAsync(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
static const QString messageTemp = QStringLiteral("<div class=\"%1\">%2</div>\r\n");
static const char typeList[] = { 'd', 'w', 'c', 'f', 'i' };
static QMutex mutex;
static QFile file;
static QTextStream textStream;
static uint count = 0;
static const uint maxCount = 512;
Q_UNUSED(context)
QDateTime dt = QDateTime::currentDateTime();
//每小时一个文件
QString fileNameDt = dt.toString(QStringLiteral("yyyy-MM-dd_hh"));
//每分钟一个文件
//QString fileNameDt = dt.toString("yyyy-MM-dd_hh_mm");
QString contentDt = dt.toString(QStringLiteral("yyyy-MM-dd hh:mm:ss"));
QString message = QStringLiteral("%1 %2").arg(contentDt).arg(msg);
QString htmlMessage = messageTemp.arg(typeList[static_cast<int>(type)]).arg(message);
QString newfileName = QStringLiteral("%1/%2_log.html").arg(gLogDir).arg(fileNameDt);
mutex.lock();
if (file.fileName() != newfileName)
{
if (file.isOpen())
{
file.close();
}
file.setFileName(newfileName);
bool exist = file.exists();
file.open(QIODevice::WriteOnly | QIODevice::Append);
textStream.setDevice(&file);
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
textStream.setEncoding(QStringConverter::Utf8);
#else
textStream.setCodec("UTF-8");
#endif
if (!exist)
{
textStream << logTemplate << "\r\n";
}
}
textStream << htmlMessage;
textStream.flush();
count += htmlMessage.length();
if (count >= maxCount)
{
file.close();
file.open(QIODevice::WriteOnly | QIODevice::Append);
}
mutex.unlock();
#ifdef Q_OS_WIN
::OutputDebugString(message.toStdWString().data());
::OutputDebugString(L"\r\n");
#else
fprintf(stderr, message.toStdString().data());
#endif
}
static void outputMessage(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{
static const QString messageTemp = QStringLiteral("<div class=\"%1\">%2</div>\r\n");
static const char typeList[] = { 'd', 'w', 'c', 'f', 'i' };
static QMutex mutex;
Q_UNUSED(context)
QDateTime dt = QDateTime::currentDateTime();
//每小时一个文件
QString fileNameDt = dt.toString(QStringLiteral("yyyy-MM-dd_hh"));
//每分钟一个文件
//QString fileNameDt = dt.toString("yyyy-MM-dd_hh_mm");
QString contentDt = dt.toString(QStringLiteral("yyyy-MM-dd hh:mm:ss"));
QString message = QStringLiteral("%1 %2").arg(contentDt).arg(msg);
QString htmlMessage = messageTemp.arg(typeList[static_cast<int>(type)]).arg(message);
QFile file(QStringLiteral("%1/%2_log.html").arg(gLogDir).arg(fileNameDt));
mutex.lock();
bool exist = file.exists();
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream textStream(&file);
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
textStream.setEncoding(QStringConverter::Utf8);
#else
textStream.setCodec("UTF-8");
#endif
if (!exist)
{
textStream << logTemplate << "\r\n";
}
textStream << htmlMessage;
file.close();
mutex.unlock();
#ifdef Q_OS_WIN
::OutputDebugString(message.toStdWString().data());
::OutputDebugString(L"\r\n");
#else
fprintf(stderr, message.toStdString().data());
#endif
}
} // namespace Logger