这个日志库基于消费者队列写的
- 可以按小时存,按天存,按程序启动时间存
- Debug、Warning、Critical、Fatal、Info,分开保存
- 日志超过一定大小,自动分成另外一个日志
- 包含了Windows捕获异常,生成Dump文件
存在的问题
- 由于是基于消费者队列,所以日志无法保证实时输出
- 资源消耗,cpu占用率
#pragma once
#include <QObject>
#include <QTime>
#include <QString>
#include "libpublic.h"
#define MAXLOGSPACE 100*1024*1024 //100MB
class CMyLog :public QObject
{
Q_OBJECT;
public:
static CMyLog * GetKernel()
{
static CMyLog instance;
return &instance;
}
//日志模式
enum nLogRotateType
{
Rotate_Day, //按天存
Rotate_Hour, //按小时保存
Rotate_RunTime, //按运行时间保存
};
//************************************
// 日期: 2020/06/05
// 函数: initLog
// 参数: const QString & logpath
// 返回: void
// 功能: 初始化日志
//************************************
void initLog(const QString& logpath = LibPublic::GetCurrentPath() + "/log/");
//************************************
// 日期: 2020/06/05
// 函数: setLogFileMaxSpace
// 参数: qint64 space
// 返回: void
// 功能: 设置每份日志最大大小
//************************************
void setLogFileMaxSpace(qint64 space = MAXLOGSPACE);
//************************************
// 日期: 2020/06/05
// 函数: setLogFileRotateType
// 参数: nLogRotateType type
// 返回: void
// 功能: 设置日志分隔种类
//************************************
void setLogFileRotateType(nLogRotateType type = Rotate_Hour);
private:
CMyLog();
~CMyLog();
};
#include "cmylog.h"
#include "cconsumequeue.h"
#include <QFile>
#include <QDebug>
#if defined(Q_OS_WIN32)
#include <windows.h>
#include <DbgHelp.h>
//生产DUMP文件
int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExceptionPointers, PWCHAR pwAppName)
{
BOOL bOwnDumpFile = FALSE;
HANDLE hDumpFile = hFile;
MINIDUMP_EXCEPTION_INFORMATION ExpParam;
typedef BOOL(WINAPI * MiniDumpWriteDumpT)(
HANDLE,
DWORD,
HANDLE,
MINIDUMP_TYPE,
PMINIDUMP_EXCEPTION_INFORMATION,
PMINIDUMP_USER_STREAM_INFORMATION,
PMINIDUMP_CALLBACK_INFORMATION
);
MiniDumpWriteDumpT pfnMiniDumpWriteDump = nullptr;
HMODULE hDbgHelp = LoadLibrary(L"DbgHelp.dll");
if (hDbgHelp)
pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");
if (pfnMiniDumpWriteDump)
{
if (hDumpFile == nullptr || hDumpFile == INVALID_HANDLE_VALUE)
{
//TCHA