QT文件日志系统(可选择出到文件,数据库,或者网络传输)
生活随笔
收集整理的這篇文章主要介紹了
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_OBJECT public: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:QUdpSocket m_socket;QSqlDatabase m_db;QMutex m_mutex; };#endif // LOGGER_H以下為logger.cpp:
#include "logger.h" #include <QDebug> #include <QDateTime>// 禁止其他文件訪問,只能通過接口設置 static LogMode g_logMode = LM_FILE; static QString g_filePath; static int g_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 日志系統(文件、網絡、數據庫)
總結
以上是生活随笔為你收集整理的QT文件日志系统(可选择出到文件,数据库,或者网络传输)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QTexe软件设置系统默认的图标
- 下一篇: QT右键菜单栏