You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
6.4 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*********************************************************************
*文件说明: 日志打印库
*作者: logos
*日期: 2018/09/01
*修改日志: 2018/09/01 logos 从comm剥离
***********************************************************************/
#pragma once
#ifndef DLL_INCLUDE_LOG_H
#define DLL_INCLUDE_LOG_H
#ifndef EXPORT_C
#define EXPORT_C extern "C"
#endif
#ifndef WINAPI
#define WINAPI __stdcall
#endif
//此宏判断条件不成立,则返回指定值(int),代码中可考虑使用,简化代码
#define RETURN_CHK(p, v) if (!(p)) \
{\
trace(LEVEL_WARN, __FILE__, __LINE__, __FUNCTION__, "return:%d", v); \
return (v); \
}
//日志打印回调函数接口类型
//level 打印等级
//pszlog 日志内容
//param 注册时附加参数
typedef void (WINAPI *RECALL_LOG)(int level, const char* pszlog, void* param);
enum EM_LOG_LEVEL
{//打印类型-等级
LEVEL_CRIT = 0,
LEVEL_ERR,
LEVEL_WARN,
LEVEL_INFO1,
LEVEL_INFO2,
LEVEL_INFO3,
LEVEL_INFO4,
};
//此处定义打印log接口
#define LOG_INFO(msg, ...) trace(LEVEL_INFO1, 0, 0, 0, msg, __VA_ARGS__)
#define LOG_INF1(msg, ...) trace(LEVEL_INFO2, 0, 0, 0, msg, __VA_ARGS__)
#define LOG_INF2(msg, ...) trace(LEVEL_INFO3, 0, 0, 0, msg, __VA_ARGS__)
#define LOG_INF3(msg, ...) trace(LEVEL_INFO4, 0, 0, 0, msg, __VA_ARGS__)
#define LOG_WARN(msg, ...) trace(LEVEL_WARN, __FILE__, __LINE__, __FUNCTION__, msg, __VA_ARGS__)
#define LOG_ERR(msg, ...) trace(LEVEL_ERR, __FILE__, __LINE__, __FUNCTION__, msg, __VA_ARGS__)
#define LOG_CRIT(msg, ...) trace(LEVEL_CRIT, __FILE__, __LINE__, __FUNCTION__, msg, __VA_ARGS__)
struct TLogConfig
{//日志配置项目
int logLevel; //打印等级 最低 LEVEL_WARN 最高 LEVEL_INFO3
int bJustSave; //日志即时保存 1立即保存 0不立即保存 立即保存到文件,对硬盘损耗较大
int buffsize; //日志缓冲区大小 单位Byte 保存在内存中为0则不设置缓冲区只能从文件中看
int filesize; //日志单个文件大小 单位MByte
int autoClear; //日志自动清理总开关 1清理 0不清理
int clearDay; //单个日志保留多少天 -- 0 无效
int clearCount; //总共保存多少个文件 -- 0 无效
int clearSize; //总共保存多少M日志文件 -- 0 无效 单位MByte
};
#define LOG_MAX_BUFF 10240 //单条日志最大字节
#define LOG_NAME "sys.log"
#define LOG_CFG_KEY "log" //在配置文件中(data\\sys.cfg)的设置key [log]
#define LOG_SAVE_FLAG "justSave" //日志即时保存 默认 justSave=0
#define LOG_LEVEL "level" //日志打印等级 默认 level=4
#define LOG_BUFF_SIZE "buff_size" //日志缓冲区大小 默认 buff_size=4096
#define LOG_FILE_SIZE "file_size" //日志单个文件大小 默认 file_size=20
#define LOG_CLEAR_FLAG "clear" //日志自动清理开关 默认 clear=1
#define LOG_CLEAR_DAY "clear_day" //单个日志保留多少天 默认 clear_day=15
#define LOG_CLEAR_CNT "clear_count" //日志保存多少个文件 默认 clear_count=0
#define LOG_CLEAR_SIZE "clear_size" //日志保存多大日志文件 默认 clear_size=0
/****************************************************
*Function: 初始化日志模块
*Intput: NULL
*Output: NULL
*Return: 成功返回0 ,失败返回错误码
******************************************************/
EXPORT_C int WINAPI log_init();
/****************************************************
*Function: 释放日志模块 -- 初始化N次就要释放N次
*Intput: NULL
*Output: NULL
*Return: 成功返回0 ,失败返回错误码
******************************************************/
EXPORT_C int WINAPI log_deinit();
/****************************************************
*Function: 获取日志打印参数
*Intput: pcfg 日志打印参数
*Output: pcfg 日志打印参数
*Return: 成功返回0失败返回错误码
******************************************************/
EXPORT_C int WINAPI get_log_config(TLogConfig* pcfg);
/****************************************************
*Function: 设置日志打印参数
*Intput: pcfg 日志打印参数
*Output: NULL
*Return: 成功返回0失败返回错误码
******************************************************/
EXPORT_C int WINAPI set_log_config(const TLogConfig* pcfg);
/****************************************************
*Function: 按当前时间(精确到秒),保存当前日志文件
*Intput: NULL
*Output: NULL
*Return: 成功返回0失败返回错误码
*PS: 调用此接口,可以不关闭程序查看日志文件
******************************************************/
EXPORT_C int WINAPI save_now_log();
/****************************************************
*Function: 打印log函数,静态调用时,可直接用宏调用
*Intput: LogLevel打印级别分为info1, info2, info3, warn error crit
file 文件名, warn级别以必须加入
line 文件行, warn级别以必须加入
fun 函数名, warn级别以必须加入
msgFormat 字符串格式与printf用法相同
后面可加N个参数最大支持1024个字节
*Output: NULL
*Return: 成功返回0失败返回错误码
******************************************************/
EXPORT_C int WINAPI trace(int LogLevel, const char* file, int line, const char* fun, const char *pszFormat, ...);
/****************************************************
*Function: 打印log函数,主要用于vb/c#调用
*Intput: LogLevel打印级别分为info1, info2, info3, warn error crit
pszLog 要打印内容
*Output: NULL
*Return: 成功返回0失败返回错误码
******************************************************/
EXPORT_C int WINAPI traces(int LogLevel, const char *pszLog);
/****************************************************
*Function: 注册日志打印接口,注册后所有日志都会回调到此函数地址
*Intput: rcLog 回调函数地址
lparam 附加参数可以NULL
*Output: NULL
*Return: 成功返回0失败返回错误码
******************************************************/
EXPORT_C int WINAPI regist_log_recv(RECALL_LOG rcLog, void* lparam);
/****************************************************
*Function: 释放日志打印注册接口
*Intput: NULL
*Output: NULL
*Return: 成功返回0失败返回错误码
******************************************************/
EXPORT_C int WINAPI unregist_log_recv();
/****************************************************
*Function: 获取日志缓冲区中的日志内容,
仅当日志缓冲区大小设置大于0时才能获取
*Intput: pszLog 日志缓存区
nSize 缓冲区大小
start 从哪开始获取?
*Output: NULL
*Return: 返回获取到的字节大小,失败返回错误码<0
******************************************************/
EXPORT_C int WINAPI get_log_buff(char* pszLog, int nSize, int start = 0);
#endif //防止重复包含头文件