64 lines
2.3 KiB
C++
64 lines
2.3 KiB
C++
#ifndef LOGHANDLER_H
|
|
#define LOGHANDLER_H
|
|
|
|
#include <QtCore/qglobal.h>
|
|
|
|
#if defined(MYLOGGER_TESTING)
|
|
#include <QString>
|
|
#endif
|
|
|
|
// 公用库在动态库、源码嵌入和静态链接三种场景下使用不同导出声明,
|
|
// 避免消费者把库符号错误标记为导出符号;源码嵌入模式由 MyLogger.pri 定义 MYLOGGER_STATIC。
|
|
#if defined(MYLOGGER_STATIC)
|
|
# define MYLOGGER_EXPORT
|
|
#elif defined(MYLOGGER_LIBRARY)
|
|
# define MYLOGGER_EXPORT Q_DECL_EXPORT
|
|
#else
|
|
# define MYLOGGER_EXPORT Q_DECL_IMPORT
|
|
#endif
|
|
|
|
// 进程级 Qt 消息处理器封装类,负责把 qDebug 等全局日志安全地写入本地文件。
|
|
// 同一进程只能安装一个 Qt 消息处理器,因此宿主应把其安装和卸载权交给同一处生命周期管理代码。
|
|
class MYLOGGER_EXPORT LogHandler
|
|
{
|
|
public:
|
|
// 安装全局消息处理器并打开当天日志;目录或文件不可用时返回 false,调用者可在恢复权限后重试。
|
|
bool installMessageHandler();
|
|
|
|
// 卸载当前处理器、恢复安装前的处理器并同步落盘;重复调用不会影响已经恢复后的状态。
|
|
void uninstallMessageHandler();
|
|
|
|
// 返回本库是否仍持有并安装了 Qt 全局消息处理器,供宿主避免重复管理生命周期。
|
|
bool isInstalled() const;
|
|
|
|
// 返回进程内唯一实例;C++11 局部静态对象保证首次构造线程安全。
|
|
static LogHandler& Get()
|
|
{
|
|
static LogHandler m_logHandler;
|
|
return m_logHandler;
|
|
}
|
|
|
|
private:
|
|
// 禁止外部构造,确保文件句柄和 Qt 全局 handler 只由唯一实例管理。
|
|
LogHandler() = default;
|
|
};
|
|
|
|
#if defined(MYLOGGER_TESTING)
|
|
// 仅测试构建可见的访问类,用于把文件系统和分卷阈值隔离到临时目录;
|
|
// 正式库不定义该宏,因此不会向宿主程序暴露运行时配置接口。
|
|
class LogHandlerTestAccess
|
|
{
|
|
public:
|
|
// 设置测试专用日志目录;调用前必须卸载 handler,避免正在写入的文件被切换。
|
|
static void setLogDirectory(const QString &directory);
|
|
|
|
// 覆盖单文件分卷阈值;传入非正数时恢复正式库的 10 MiB 默认值。
|
|
static void setMaxLogFileBytes(qint64 bytes);
|
|
|
|
// 清除测试覆盖项,恢复正式库默认路径和分卷阈值。
|
|
static void reset();
|
|
};
|
|
#endif
|
|
|
|
#endif // LOGHANDLER_H
|