1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > QT文件日志系统(可选择出到文件 数据库 或者网络传输)

QT文件日志系统(可选择出到文件 数据库 或者网络传输)

时间:2024-04-27 17:17:38

相关推荐

QT文件日志系统(可选择出到文件 数据库 或者网络传输)

文章目录

前言一、源码如下二、使用步骤1.导入文件2.其中有三种模型总结参考

前言

在软件打包好运行时候,如果遇到系统问题,如果没有日志系统很难很快的定位到问题的位置。这个时候就需要日志系统,本文介绍的日志系统可以根据每日的日期,自动创建文件,或者可以存入数据库或者通过网络发送到指定IP三种模式可以选择。


提示:以下是本篇文章正文内容,下面案例可供参考

一、源码如下

以下为logger.h

#ifndef LOGGER_H#define LOGGER_H#include <QObject>#include <QFile>#include <QDir>#include <QUdpSocket>#include <QSqlDatabase>#include <QSqlError>#include <QSqlQuery>#include <QMutex>enum LogMode {LM_FILE,LM_NET,LM_DATABASE};class DatabaseInfo{public:QString server;QString user;QString passwd;QString dbName;int port;DatabaseInfo(const QString &ser = Q_NULLPTR,const QString &uid = Q_NULLPTR,const QString &pwd = Q_NULLPTR,const QString &name = Q_NULLPTR,int p = 3306): server(ser), user(uid), passwd(pwd), dbName(name), port(p) {}};void setLogMode(LogMode mode);void setLogFilePath(const QString &path);void setLogNetPort(int port);void setLogDatabaseInfo(const DatabaseInfo &info);void log(QtMsgType type, const QMessageLogContext &info, const QString &msg);class Logger : public QObject{Q_OBJECTpublic:explicit Logger(QObject *parent = Q_NULLPTR);~Logger();void setOutputMode(LogMode mode);void outputLog(const QString &type, const char* file, const char* func, int line, const QString &msg);private:QUdpSocketm_socket;QSqlDatabase m_db;QMutexm_mutex;};#endif // LOGGER_H

以下为logger.cpp:

#include "logger.h"#include <QDebug>#include <QDateTime>// 禁止其他文件访问,只能通过接口设置static LogModeg_logMode = LM_FILE;static QStringg_filePath;static intg_port = 8989;static DatabaseInfo g_dbInfo;void setLogMode(LogMode mode){g_logMode = mode;}void setLogFilePath(const QString &path){g_filePath = path;}void setLogNetPort(int port){g_port = port;}void setLogDatabaseInfo(const DatabaseInfo &info){g_dbInfo = info;}void log(QtMsgType type, const QMessageLogContext &info, const QString &msg){QString lType;switch (type) {case QtDebugMsg:lType = "Debug";break;case QtInfoMsg:lType = "Info";break;case QtWarningMsg:lType = "Warning";break;case QtCriticalMsg:lType = "Critical";break;case QtFatalMsg:lType = "Faltal";break;default:break;}static Logger g_logger;g_logger.outputLog(lType, info.file, info.function, info.line, msg);}Logger::Logger(QObject *parent): QObject(parent){setOutputMode(g_logMode);}Logger::~Logger(){qInstallMessageHandler(Q_NULLPTR);if(m_db.isOpen())m_db.close();}void Logger::setOutputMode(LogMode mode){if(LM_DATABASE == mode) {if(m_db.isOpen())m_db.close();m_db = QSqlDatabase::addDatabase("QMYSQL");m_db.setHostName(g_dbInfo.server);m_db.setUserName(g_dbInfo.user);m_db.setPassword(g_dbInfo.passwd);m_db.setPort(g_dbInfo.port);m_db.setDatabaseName(g_dbInfo.dbName);m_db.open();}}void Logger::outputLog(const QString &type, const char* file, const char* func, int line, const QString &msg){QMutexLocker locker(&m_mutex);QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");QString str = QString("[%1] [%2] [%3] [%4] [line:%5] ===> %6\n").arg(type).arg(file).arg(func).arg(time).arg(line).arg(msg);if(LM_FILE == g_logMode) {QString name = QString("%1/%2.txt").arg(g_filePath).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd"));QDir dir(g_filePath);if(!dir.exists())dir.mkpath(g_filePath);QFile m_file(name);if(!m_file.open(QIODevice::WriteOnly | QIODevice::Append))return;m_file.write(str.toUtf8());m_file.close();}else if(LM_NET == g_logMode) {m_socket.writeDatagram(str.toUtf8(), QHostAddress::Broadcast, g_port);}else if(LM_DATABASE == g_logMode) {try {QString sql = QString("insert into log values('%1', '%2', '%3', '%4', '%5', '%6');").arg(time).arg(type).arg(file).arg(func).arg(line).arg(msg);QSqlQuery query(m_db);query.exec(sql);}catch (const QSqlError &e) {e.text();}}}

二、使用步骤

1.导入文件

将上面的.h与.cpp文件导入到项目中,在按照如下的模式调用

setLogMode(LM_FILE);//设置日志系统为文件模型// DatabaseInfo info("127.0.0.1", "root", "", "log");// setLogDatabaseInfo(info);// setLogNetPort(8989);setLogFilePath(QApplication::applicationDirPath());qInstallMessageHandler(log);

2.其中有三种模型

如下(示例):

enum LogMode {LM_FILE,LM_NET,LM_DATABASE};


总结

本文选取的是文本模式,这个时候系统运行时候的"Debug"、“Info”、“Warning”、“Critical”、"Faltal"输出全部会保存到文件。

可以看到会按照日期每天生成的运行日志

如下是我写的Debug输入的日志样子,可以看到会打印出在代码哪个文件的什么函数,什么时间,那一行输出的。

参考

这个大佬的代码仓库有使用示例

ALONE_WORK / QtModuleTest

这是作者的博客说明

Qt 日志系统(文件、网络、数据库)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。