Qt中简单的日志文件实现

来源:互联网 发布:淘宝退款金额怎么修改 编辑:程序博客网 时间:2024/04/30 01:18

最近看一个音乐播放器的源码的时候,看了一下他的日志输出实现,虽然代码量不多,但是功能倒是挺齐全,有点不足的是里面只是实现了单文件输出。

这里面理解起来没有什么掌握,我只是加了简单的注释

#ifndef MUSICLOGGER_H#define MUSICLOGGER_H/* ================================================= * This file is part of the TTK Music Player project * Copyright (c) 2014 - 2016 Greedysky Studio * All rights reserved! * Redistribution and use of the source code or any derivative * works are strictly forbiden.   =================================================*/#include <QFile>#include <QTextStream>#include <QDateTime>#include "musicglobaldefine.h"#define CURRENTTIME QTime::currentTime().toString("hh:mm:ss:zzz")#define CURRENTDATE QDate::currentDate().toString("yyyy-MM-dd")#define LOG_END     QString("log::npos")#define M_LOGGER    (*MusicLogger::createInstance())#define M_MESSAGE(str, msg) \{ \    M_LOGGER.setLevel(msg); \    M_LOGGER << str << LOG_END;\}#ifdef MUSIC_DEBUG    #define M_LOGGER_INFO(str)  M_MESSAGE(str, "[Info]")    #define M_LOGGER_DEBUG(str) M_MESSAGE(str, "[Debug]")    #define M_LOGGER_WARN(str)  M_MESSAGE(str, "[Warn]")    #define M_LOGGER_TRACE(str) M_MESSAGE(str, "[Trace]")    #define M_LOGGER_ERROR(str) M_MESSAGE(str, "[Error]")    #define M_LOGGER_FATAL(str) M_MESSAGE(str, "[Fatal]")#else    #define M_LOGGER_INFO(str)  Q_UNUSED(str)    #define M_LOGGER_DEBUG(str) Q_UNUSED(str)    #define M_LOGGER_WARN(str)  Q_UNUSED(str)    #define M_LOGGER_TRACE(str) Q_UNUSED(str)    #define M_LOGGER_ERROR(str) Q_UNUSED(str)    #define M_LOGGER_FATAL(str) Q_UNUSED(str)#endif/*! @brief The class of the application logger. * @author Greedysky <greedysky@163.com> */class MUSIC_CORE_EXPORT MusicLogger{public:    //通过静态初始化对象实现单例模式    static inline MusicLogger* createInstance()    {        static MusicLogger obj;        return &obj;    }    /*!     * Get object instance ptr.     */    static QString getClassName()    {        return "MusicLogger";    }    /*!     * Get class object name.     */    inline void setLevel(const QString &level)    {        m_levelType = level;    }    /*!     * Set logger level.     */    inline QString level() const    {        return m_levelType;    }    /*!     * Get logger level.     */    inline MusicLogger &operator <<(bool t)    {#ifdef MUSIC_DEBUG        m_streamString.append( QString("%1 ").arg(t ? "true" : "false") );#else        //取消编译器警告信息        Q_UNUSED(t);#endif        return *this;    }    inline MusicLogger &operator<<(char t) { return debugData<char>(t); }    inline MusicLogger &operator<<(signed short t) { return debugData<short>(t);}    inline MusicLogger &operator<<(unsigned short t) { return debugData<ushort>(t); }    inline MusicLogger &operator<<(signed int t) { return debugData<int>(t); }    inline MusicLogger &operator<<(unsigned int t) { return debugData<uint>(t); }    inline MusicLogger &operator<<(signed long t) { return debugData<long>(t); }    inline MusicLogger &operator<<(unsigned long t) { return debugData<ulong>(t); }    inline MusicLogger &operator<<(qint64 t) { return debugData<qint64>(t); }    inline MusicLogger &operator<<(quint64 t) { return debugData<quint64>(t); }    inline MusicLogger &operator<<(float t) { return debugData<float>(t); }    inline MusicLogger &operator<<(double t) { return debugData<double>(t); }    inline MusicLogger &operator<<(const char *t) { return debugData<const char*>(t); }    inline MusicLogger &operator<<(const QString &t)    {#ifdef MUSIC_DEBUG        //每次遇到结束符号,导入文件        if(t == LOG_END)        {            m_stream << QString("[%1 %2]:  %3").arg(CURRENTDATE).arg(CURRENTTIME).arg(m_streamString) << endl;            m_streamString.clear();        }        else        {            debugData<QString>(t);        }#else        Q_UNUSED(t);#endif        return *this;    }    inline MusicLogger &operator<<(const QStringRef &t) { return debugData<QString>(t.toString()); }    inline MusicLogger &operator<<(const QLatin1String &t) { return debugData<QLatin1String>(t); }    inline MusicLogger &operator<<(const QByteArray &t) { return debugData<QString>(QString(t)); }    /*!     * Operator << override.     */private:    MusicLogger()    {#ifdef MUSIC_DEBUG        m_file.setFileName("logger.txt");        m_file.open(QIODevice::WriteOnly | QIODevice::Append);        m_stream.setDevice(&m_file);        m_stream << QString().rightJustified(70, '=') << endl;        m_levelType = "[Info]";#endif    }    /*!     * Object contsructor.     */    ~MusicLogger()    {#ifdef MUSIC_DEBUG        m_file.close();#endif    }//用模板实现除str变量之外的所有<<函数的公用操作    template <class T>    MusicLogger &debugData(const T &data)    {#ifdef MUSIC_DEBUG        m_streamString.append( QString("%1 %2 ").arg(m_levelType).arg(data) );#else        Q_UNUSED(data);#endif        return *this;    }    /*!     * Output debug data into local file.     */    QTextStream m_stream;//关联日志导出文件    QString m_streamString;//每次写内容的时候作为临时缓存,当遇到结束符的时候一并导入文件    QString m_levelType;//日志类别    QFile m_file;};#endif // MUSICLOGGER_H


0 0