• 11610阅读
  • 9回复

Qt实现Log日志系统 [复制链接]

上一主题 下一主题
离线yanche
 

图酷模式  只看楼主 正序阅读 楼主  发表于: 2018-09-30

对于编程开发来说,Log日志系统从来都是很有必要的,一个完善的日志系统,可以帮助程序员分析程序的各种异常情况,同时也是系统维护的一个必要手段,那么既然Log系统这么重要,我今天就手把手带着你们写一个自己的Log系统。
我就直接上代码了,这样来的比较直接一些,有看不懂的,私信给我即可。
这个功能也是应广大童鞋们的心声,嘿嘿,帮助你们,大家都能获得快乐!加油哦

一、头文件代码实现
#ifndef SIMPLELOG_H
#define SIMPLELOG_H

#include <QFile>
#include <QMutex>
#include <QDateTime>
#include <QTextStream>
#include <stdio.h>

#define LOG_IDENTIFIER "_Log.html"

#define LOG_INFO        0
#define LOG_WARNING     1
#define LOG_ERROR       2

#define DETAIL_INFO  QString::fromLocal8Bit("<.%1.>@%2=>%3:   ").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__)

#define LOGERROR(_log) SimpleLog::getInstance()->writeLog(_log, DETAIL_INFO, LOG_ERROR)
#define LOGINFO(_log) SimpleLog::getInstance()->writeLog(_log, DETAIL_INFO, LOG_INFO)
#define LOGWRANING(_log) SimpleLog::getInstance()->writeLog(_log, DETAIL_INFO, LOG_WARNING)

class SimpleLog
{
private:
    SimpleLog();
    static SimpleLog* m_instance;
public:
    ~SimpleLog();
    static SimpleLog* getInstance();
    void writeLog(QString _log, QString _details = "", int _flag = LOG_INFO);
private:
    void openNewLog();
    void endLog();
private:
    QFile m_log;
    QMutex m_mutex;
    QTextStream m_stream;
    int m_index;
};
#endif // SIMPLELOG_H


二、CPP文件代码实现

#include "simplelog.h"
#include <QDir>
#include <QSettings>
#include <QApplication>
#include <QDebug>

SimpleLog* SimpleLog::m_instance = new SimpleLog;
SimpleLog*  SimpleLog::getInstance()
{
    return m_instance;
}

SimpleLog::SimpleLog()
{
    QDir _applicationDir(QCoreApplication::applicationDirPath());
    _applicationDir.cdUp();

    if (!_applicationDir.exists(_applicationDir.path() + "/log"))
    {
        _applicationDir.mkpath(_applicationDir.path() + "/log");
    }
    _applicationDir.cd("log");
    QString date = QDate::currentDate().toString("yyyy-MM-dd");
    QString time = QTime::currentTime().toString("hh-mm-ss");
    QString fileNamelog;
    fileNamelog+=date;
    fileNamelog+=" ";
    fileNamelog+=time;
    fileNamelog+=LOG_IDENTIFIER;
    QString _path = _applicationDir.path() + "/" + date;
    if (!_applicationDir.exists(_path))
    {
        _applicationDir.mkpath(_path);
    }
    _applicationDir.cd(date);

    m_index = 0;

    m_log.setFileName(_applicationDir.path() + "/" + fileNamelog);
    if (m_log.exists())m_log.remove();
    if (m_log.open(QIODevice::ReadWrite | QIODevice::Text | QFile::Append))
    {
        m_stream.setDevice(&m_log);
       QString _logTitle =QString::fromLocal8Bit("<html>\n<head>\n<title>日志记录</title>\n</head>\n<body>\n");
        m_stream << _logTitle;
    }
    else
    {
        QString _err = m_log.errorString();
    }
}

SimpleLog::~SimpleLog()
{
    endLog();
}

void SimpleLog::writeLog(QString _log, QString _details, int _flag)
{
    QString time = QTime::currentTime().toString("hh:mm:ss");
    m_mutex.lock();
    if (_flag == LOG_INFO)
    {
       m_stream << "<br><font size=\"3\" color=\"#459EF6\"family= \"微软雅黑\">" << "Index: "<<m_index << "  Time-->" << time << " " <<  _details<< _log<< "</font>";
    }
    else  if (_flag == LOG_WARNING)
    {
       m_stream << "<br><font size=\"3\" color=\"#0000FF\"family= \"微软雅黑\">" << "Index: "<<m_index << "  Time-->" << time << " " << _details << _log<< "</font>";
    }
    else if (_flag == LOG_ERROR)
    {
       m_stream << "<br><font size=\"3\" color=\"#FF0000\"family= \"微软雅黑\">" << "Index: "<<m_index << "  Time-->" << time << " " << _details << _log<< "</font>";
    }
    m_stream.flush();
    m_log.flush();
    m_index += 1;
    m_mutex.unlock();
}

void SimpleLog::endLog()
{
    if (m_log.isOpen())
    {
        m_stream << "</body>";
        m_stream.flush();
        m_log.flush();
        m_log.close();
    }
}


希望可以帮助那些还有疑惑或者对这块不了解的同学们,如果不懂的也可以在私信给我,我将会给你提供对应的帮助。
邮箱:ycloco001@126.com
WeChat:yanche521



如果觉得这篇文章对你有用,请记得关注或打赏哦,谢谢。

具有十年研发经验的团队,专注于C++、Qt、Python等语言,专业软件开发团队,致力于完美解决客户的需求,我们期待与您的洽谈。
业务范畴:应用软件定制、UI定制、各类管理系统定制、仿真设计、三维开发、通信SDK定制、Logo设计等等
QQ:548725431
微信:yanche521
离线sharkoasis

只看该作者 9楼 发表于: 2018-11-09
复杂的还是用第三方吧,qt可以用简单的,重定向qDebug等即可。
boost的log还是不错的
在线圣域天子

只看该作者 8楼 发表于: 2018-11-08
确实,正式环境中的日志一般都会用子线程或其它方式写,以免影响主线程的性能。
离线cycloveu

只看该作者 7楼 发表于: 2018-11-08
日志系统最少也得弄个生产者消费者来写吧,这样直接写文件会影响主线程的效率。没有别的意思哈,别喷。
大道至简 悟在天成
离线yanche

只看该作者 6楼 发表于: 2018-10-09
各位其他开发人员,不要因为这个二货影响大家的心情,我们不能和社会Rubbish一样,咱们继续交流技术,不用理会这种人
具有十年研发经验的团队,专注于C++、Qt、Python等语言,专业软件开发团队,致力于完美解决客户的需求,我们期待与您的洽谈。
业务范畴:应用软件定制、UI定制、各类管理系统定制、仿真设计、三维开发、通信SDK定制、Logo设计等等
QQ:548725431
微信:yanche521
离线yanche

只看该作者 5楼 发表于: 2018-10-09
回 hitler++ 的帖子
hitler++:这样一个半成品都不算,hello world级别的东西还打上广告 (2018-09-30 23:55) 

你看不明白,不要乱喷粪,人家其他人使用的时候都是好好的,就你特殊啊,我看你也是个不受重视的屌丝,充其量会百度几行人家吃过的代码而已,自己也就是个笨蛋吧,哈哈
具有十年研发经验的团队,专注于C++、Qt、Python等语言,专业软件开发团队,致力于完美解决客户的需求,我们期待与您的洽谈。
业务范畴:应用软件定制、UI定制、各类管理系统定制、仿真设计、三维开发、通信SDK定制、Logo设计等等
QQ:548725431
微信:yanche521
离线yanche

只看该作者 4楼 发表于: 2018-10-09
回 hitler++ 的帖子
hitler++:这样一个半成品都不算,hello world级别的东西还打上广告 (2018-09-30 23:55) 

你自己写一个出来,让大家看看,没本事不要在这里满嘴喷粪啊
具有十年研发经验的团队,专注于C++、Qt、Python等语言,专业软件开发团队,致力于完美解决客户的需求,我们期待与您的洽谈。
业务范畴:应用软件定制、UI定制、各类管理系统定制、仿真设计、三维开发、通信SDK定制、Logo设计等等
QQ:548725431
微信:yanche521
离线yanche

只看该作者 3楼 发表于: 2018-10-09
回 hitler++ 的帖子
hitler++:这样一个半成品都不算,hello world级别的东西还打上广告 (2018-09-30 23:55) 

看不懂,不要瞎比比
具有十年研发经验的团队,专注于C++、Qt、Python等语言,专业软件开发团队,致力于完美解决客户的需求,我们期待与您的洽谈。
业务范畴:应用软件定制、UI定制、各类管理系统定制、仿真设计、三维开发、通信SDK定制、Logo设计等等
QQ:548725431
微信:yanche521
离线hitler++

只看该作者 2楼 发表于: 2018-09-30

离线hitler++

只看该作者 1楼 发表于: 2018-09-30
这样一个半成品都不算,hello world级别的东西还打上广告
快速回复
限100 字节
 
上一个 下一个