《QT实用小工具·二十五》日志重定向输出

1、概述
源码放在文章末尾

日志重定向输出,包含如下功能:

  1. 支持动态启动和停止。
  2. 支持日志存储的目录。
  3. 支持网络发出打印日志。
  4. 支持输出日志上下文信息比如所在代码文件、行号、函数名等。
  5. 支持设置日志文件大小限制,超过则自动分文件,默认128kb。
  6. 支持按照日志行数自动分文件,和日志大小条件互斥。
  7. 可选按照日期时间区分文件名存储日志。
  8. 日志文件命名规则优先级:行数》大小》日期。
  9. 自动加锁支持多线程。
  10. 可以分别控制哪些类型的日志需要重定向输出。
  11. 支持Qt4+Qt5+Qt6,开箱即用。
  12. 使用方式最简单,调用函数start()启动服务,stop()停止服务。

下面是demo演示:

项目部分代码如下:

cpp 复制代码
#ifndef SAVELOG_H
#define SAVELOG_H

/**
 * 日志重定向输出
 * 1. 支持动态启动和停止。
 * 2. 支持日志存储的目录。
 * 3. 支持网络发出打印日志。
 * 4. 支持输出日志上下文信息比如所在代码文件、行号、函数名等。
 * 5. 支持设置日志文件大小限制,超过则自动分文件,默认128kb。
 * 6. 支持按照日志行数自动分文件,和日志大小条件互斥。
 * 7. 可选按照日期时间区分文件名存储日志。
 * 8. 日志文件命名规则优先级:行数》大小》日期。
 * 9. 自动加锁支持多线程。
 * 10. 可以分别控制哪些类型的日志需要重定向输出。
 * 11. 支持Qt4+Qt5+Qt6,开箱即用。
 * 12. 使用方式最简单,调用函数start()启动服务,stop()停止服务。
 */

#include <QObject>

class QFile;
class QTcpSocket;
class QTcpServer;

//消息类型
enum MsgType {
    MsgType_Debug = 0x0001,
    MsgType_Info = 0x0002,
    MsgType_Warning = 0x0004,
    MsgType_Critical = 0x0008,
    MsgType_Fatal = 0x0010,
};

#ifdef quc
class Q_DECL_EXPORT SaveLog : public QObject
#else
class SaveLog : public QObject
#endif

{
    Q_OBJECT
public:
    static SaveLog *Instance();
    explicit SaveLog(QObject *parent = 0);
    ~SaveLog();

private:
    static QScopedPointer<SaveLog> self;

    //是否在运行
    bool isRun;
    //文件最大行数 0表示不启用
    int maxRow, currentRow;
    //文件最大大小 0表示不启用 单位kb
    int maxSize;
    //是否重定向到网络
    bool toNet;
    //是否输出日志上下文
    bool useContext;

    //文件对象
    QFile *file;
    //日志文件路径
    QString path;
    //日志文件名称
    QString name;
    //日志文件完整名称
    QString fileName;
    //消息类型
    MsgType msgType;

private:
    void openFile(const QString &fileName);

public:
    bool getUseContext();
    MsgType getMsgType();

Q_SIGNALS:
    //发送内容信号
    void send(const QString &content);

public Q_SLOTS:
    //启动日志服务
    void start();
    //暂停日志服务
    void stop();

    //清空状态
    void clear();
    //保存日志
    void save(const QString &content);

    //设置日志文件最大行数
    void setMaxRow(int maxRow);
    //设置日志文件最大大小 单位kb
    void setMaxSize(int maxSize);

    //设置监听端口
    void setListenPort(int listenPort);
    //设置是否重定向到网络
    void setToNet(bool toNet);
    //设置是否输出日志上下文
    void setUseContext(bool useContext);

    //设置日志文件存放路径
    void setPath(const QString &path);
    //设置日志文件名称
    void setName(const QString &name);
    //设置消息类型
    void setMsgType(const MsgType &msgType);
};

#ifdef quc
class Q_DECL_EXPORT SendLog : public QObject
#else
class SendLog : public QObject
#endif

{
    Q_OBJECT
public:
    static SendLog *Instance();
    explicit SendLog(QObject *parent = 0);
    ~SendLog();

private:
    static QScopedPointer<SendLog> self;

    //监听端口
    int listenPort;
    //网络通信对象
    QTcpSocket *socket;
    //网络监听服务器
    QTcpServer *server;

private slots:
    //新连接到来
    void newConnection();

public Q_SLOTS:
    //设置监听端口
    void setListenPort(int listenPort);

    //启动和停止服务
    void start();
    void stop();

    //发送日志
    void send(const QString &content);
};

#endif // SAVELOG_H

源码下载

相关推荐
越来越无动于衷43 分钟前
JAVA包装类
java·开发语言
Flower#1 小时前
D. Apple Tree Traversing 【Codeforces Round 1023 (Div. 2)】
c++·算法·图论·dfs
GanGuaGua2 小时前
CSS:盒子模型
开发语言·前端·css·html
忘梓.2 小时前
从父类到子类:C++ 继承的奇妙旅程(2)
java·开发语言·c++
IT信息技术学习圈2 小时前
Python程序打包为EXE文件的全面指南
开发语言·python
进取星辰2 小时前
23、Next.js:时空传送门——React 19 全栈框架
开发语言·javascript·react.js
云和数据.ChenGuang4 小时前
人工智能 机器学习期末考试题
开发语言·人工智能·python·机器学习·毕业设计
我是小伍同学5 小时前
基于卷积神经网络和Pyqt5的猫狗识别小程序
人工智能·python·神经网络·qt·小程序·cnn
lllsure7 小时前
Python基础语法
开发语言·python
zxctsclrjjjcph8 小时前
【高并发内存池】从零到一的项目之centralcache整体结构设计及核心实现
开发语言·数据结构·c++·链表