/************************************************************************* 【文件名】 LoggerEntity.h 【功能模块和目的】 日志纪录功能实体类 【开发者及日期】 郑石诺 2015/01/06 【版本】 V1.0.0 【版权信息】 Copyright (C)2015 河南加一信息技术有限公司 【更改记录】 *************************************************************************/ #pragma once #include #include #include #include #include #include #include #include #include "logger.h" using namespace std; /************************************************************************* 【类名】 CLoggerEntity 【功能】 日志记录 【接口说明】 【开发者及日期】 郑石诺 2015/01/06 【版本】 V1.0.0 【版权信息】 Copyright (C)2015 河南加一信息技术有限公司 【更改记录】 *************************************************************************/ class CLoggerEntity : public ILogger { SINGLETON_DECLARE(CLoggerEntity) private: typedef struct tagLOG_ITEM { LOG_CLASS Class; LOG_LEVEL Level; TCHAR Date[LOG_DATATIME_LEN]; TCHAR Content[LOG_BUFFER_LENGTH]; tagLOG_ITEM(LOG_CLASS a_Class, LOG_LEVEL a_Level, LPCTSTR a_Date, LPCTSTR a_Content) : Class(a_Class), Level(a_Level) { ASSERT(a_Date != NULL); lstrcpy(Date, a_Date); ASSERT(a_Content != NULL); lstrcpy(Content, a_Content); } } LOG_ITEM, *PLOG_ITEM; typedef std::list ITEMLIST; public: virtual ~CLoggerEntity(void); virtual void init(CListCtrl* pList, LOG_DEV nDevType, LPCTSTR lpFilePath = NULL) override; // 初始化 virtual void close(void)override; // 关闭 virtual void start(void)override; // 开始显示日志 virtual void stop(void)override; // 停止显示日志 virtual void log(LOG_CLASS nClass, LOG_LEVEL nLevel, char* format, ...)override; // 显示日志 virtual void filterShow(LOG_CLASS nClass = LOG_CLASS_GENERAL, LOG_LEVEL nLevel = LOG_LEVEL_NORMAL)override; // 日志过滤 virtual BOOL isStart(void)override { return m_bIsLogger; } private: CLoggerEntity(void); // 记录日志信息线程函数 void logThread(); // 线程函数(写文件) // 日志操作方法 void __frameControl(); // 日志界面控制 void __initConsoleWindow(void); // 打开控制台窗口 FILE* __openLoggerFile(void); // 创建日志文件 void __pushLog(LOG_CLASS nClass, LOG_LEVEL nLevel, LPCTSTR lpMessage); void __saveLog(PLOG_ITEM pItem, FILE* pFile); // 展示并保存日志 void __flush(void); private: const static int FILE_MAX_SIZE = 5*1024*1024; // 文件最大长度限制 const static int LOG_BUFFER_SIZE = 2048; // 日志缓冲大小 //BOOL m_bStopLog; // 是否停止记录线程 std::atomic m_bStopLog; BOOL m_bIsLogger; // 是否启用日志记录 CListCtrl* m_pListCtrl; // 日志列表控件 UINT m_nFilterClass; // 日志类型的过滤方式 UINT m_nFilterLevel; // 日志级别的过滤方式 CString m_arClass[4]; // 日志类型对应字符串值 CString m_arLevel[5]; // 日志级别对应字符串值 LOG_DEV m_nDevType; // 日志发起设备 CString m_strLoggerName; // 根据设备得出日志名 CString m_strFileDircet; // 写文件目录 ITEMLIST m_ItemList; // 日志项缓冲区 std::shared_ptr m_pThread; std::mutex m_mut; // 线程临界区对象 std::atomic m_logBufferSize; // 当前日志缓存区数量 std::condition_variable_any m_cond; // 条件变量 int32_t m_pListCtrlCount; // 设置m_pListCtrl一共显示的行数 };