windows下高效的c/c++日志记录-C文档类资源-CSDN下载window下的log.dll、log.lib更多下载资源、学习资料请访问CSDN下载频道.
https://download.csdn.net/download/github_37687123/76685999

#pragma once
#ifndef _H_LOG_
#define _H_LOG_
#ifdef __cplusplus
extern "C" {
#endif
#if ( defined _WIN32 )
#elif ( defined __unix ) || ( defined _AIX ) || ( defined __linux__ ) || ( defined __hpux )
#ifndef _WINDLL_FUNC
#define _WINDLL_FUNC
#endif
#endif
#if ( defined _WIN32 )
#include <windows.h>
#include <share.h>
#include <io.h>
#include <fcntl.h>
#elif ( defined __unix ) || ( defined _AIX ) || ( defined __linux__ ) || ( defined __hpux )
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <syslog.h>
#include <pthread.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <stdarg.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
/// <summary>
/// 日志标签
/// </summary>
static char log_level_label[][6 + 1] = { "DEBUG " , "INFO " , "NOTICE" , "WARN " , "ERROR " , "FATAL " , "NOLOG " };
#define LOG_FILE_NAME "./debug.log"
#define LOG_RETURN_ERROR_ALLOC -11 /* 申请内存失败 */ /* alloc memory failure */
#define LOG_RETURN_ERROR_INTERNAL -12 /* 内部错误 */ /* internal error */
#define LOG_RETURN_ERROR_ALLOC_MAX -13 /* 内存使用超限 */ /* memory usage transfinite */
#define LOG_RETURN_ERROR_PARAMETER -14 /* 参数错误 */ /* parameter invalid */
#define LOG_RETURN_ERROR_NOTSUPPORT -17 /* 暂不支持 */ /* not support */
#define LOG_RETURN_ERROR_CREATEFILE -21 /* 创建文件失败 */ /* failed to create file */
#define LOG_RETURN_ERROR_OPENFILE -22 /* 打开文件失败 */ /* failed to open file */
#define LOG_RETURN_ERROR_WRITEFILE -23 /* 写文件失败 */ /* failed to write file */
#define LOG_RETURN_ERROR_TOO_MANY_STYLES -31 /* 风格列太多了 */
#define LOG_RETURN_ERROR_CONFIGFILE_NOTFOUND -51 /* 找不到配置文件 */
#define LOG_RETURN_ERROR_CONFIGFILE_INVALID -52 /* 配置文件无效 */
/// <summary>
/// log_output_set
/// </summary>
#define LOG_OUTPUT_INVALID -1 /* 不设置 */ /* no set */
#define LOG_OUTPUT_STDOUT 1 /* 标准输出 */ /* stdout */
#define LOG_OUTPUT_STDERR 2 /* 标准错误输出 */ /* stderr */
#define LOG_OUTPUT_SYSLOG 3 /* UNIX&Linux的syslog 或 Windows的WINDOWS EVENT */
#define LOG_OUTPUT_FILE 11 /* 文件 */ /* file */
#define LOG_OUTPUT_CALLBACK 21 /* (使用自定义日志输出回调函数) */ /* using custom log output callback function */
/// <summary>
/// log_level_set
/// </summary>
#define LOG_LEVEL_INVALID -1 /* 无效等级 */ /* no log */
#define LOG_LEVEL_DEBUG 0 /* 调试等级 */ /* debug level */
#define LOG_LEVEL_INFO 1 /* 普通信息等级 */ /* info level */
#define LOG_LEVEL_NOTICE 2 /* 通知等级 */ /* notice level */
#define LOG_LEVEL_WARN 3 /* 警告等级 */ /* warn level */
#define LOG_LEVEL_ERROR 4 /* 错误等级 */ /* error level */
#define LOG_LEVEL_FATAL 5 /* 严重错误等级 */ /* error level */
#define LOG_LEVEL_NOLOG 6 /* 不需要输出日志 */ /* no log */
#define LOG_LEVEL_DEFAULT LOG_LEVEL_NOLOG
/// <summary>
/// log_style_set
/// </summary>
#define LOG_STYLE_INVALID -1 /* 无效行日志风格 */
#define LOG_STYLE_DATE 0x00001 /* 日期"YYYY-MM-DD" */ /* date "YYYY-MM-DD" */
#define LOG_STYLE_DATETIME 0x00002 /* 日期时间"YYYY-MM-DD hh:mm:ss" */ /* date time "YYYY-MM-DD hh:mm:ss" */
#define LOG_STYLE_DATETIMEMS 0x00004 /* 日期时间毫秒"YYYY-MM-DD hh:mm:ss.6ms"(日期时间类宏互斥,优先自动选用信息量最多的) */ /* date time "YYYY-MM-DD hh:mm:ss.6ms" */
#define LOG_STYLE_LOGLEVEL 0x00008 /* 日志等级 */ /* log level */
#define LOG_STYLE_PID 0x00010 /* 进程id */ /* pid */
#define LOG_STYLE_TID 0x00020 /* 线程id */ /* tid */
#define LOG_STYLE_SOURCE 0x00040 /* "源代码文件名:源代码行号" */ /* source file name and row number */
#define LOG_STYLE_FORMAT 0x00080 /* 应用日志段 */ /* application text */
#define LOG_STYLE_NEWLINE 0x00100 /* 换行 */ /* new line */
#define LOG_STYLE_CUSTLABEL1 0x00200 /* 自定义标签1 */ /* custom label1 */
#define LOG_STYLE_CUSTLABEL2 0x00400 /* 自定义标签2 */ /* custom label2 */
#define LOG_STYLE_CUSTLABEL3 0x00800 /* 自定义标签3 */ /* custom label3 */
#define LOG_STYLE_CUSTLABEL4 0x01000 /* 自定义标签4 */ /* custom label4 */
#define LOG_STYLE_CUSTLABEL5 0x02000 /* 自定义标签5 */ /* custom label5 */
#define LOG_STYLE_CALLBACK 0x10000 /* (使用自定义行日志风格回调函数) */ /* using custom log style callback function */
#define LOG_STYLES_DEFAULT 0
#define LOG_NO_OUTPUTFUNC NULL , NULL , NULL , NULL , NULL , NULL
#define MAXLEN_FILENAME 256
#define LOG_CUST_LABELS_COUNT 30
/// <summary>
/// log_rotate_mode_set
/// </summary>
#define LOG_ROTATEMODE_INVALID -1 /* 无效转档模式 */
#define LOG_ROTATEMODE_NONE 0 /* 不转档 */ /* no rotate */
#define LOG_ROTATEMODE_SIZE 1 /* 按日志文件大小转档,和函数log_rotate_size_set配合使用;转档文件名格式"原日志文件名.序号" */ /* according to log file size turn log */
#define LOG_ROTATEMODE_PER_DAY 2 /* 按每天转档;转档文件名格式"原日志文件名.年年年年月月日日" */ /* according to daily turn log */
#define LOG_ROTATEMODE_PER_HOUR 3 /* 按小时转档;转档文件名格式"原日志文件名.年年年年月月日日_小时" */ /* according to hours turn log */
#define LOG_ROTATE_SIZE_FILE_COUNT_DEFAULT 99999999
#define LOG_ROTATE_SIZE_PRESSURE_FACTOR_DEFAULT 0
#define LOG_FSYNC_PERIOD 10000
#define LOG_BUFSIZE_DEFAULT (1024) /* 缺省行日志缓冲区大小 */
#define LOG_BUFSIZE_MAX (1024*1024) /* 最大行日志缓冲区大小 */
#define LOG_HEXLOG_BUFSIZE_DEFAULT (16*1024) /* 缺省十六进制块日志缓冲区大小 */
#define LOG_HEXLOG_BUFSIZE_MAX (10*1024*1024) /* 最大十六进制块日志缓冲区大小 */
#define LOG_NO_STYLEFUNC NULL
#define LOG_MAXCNT_CUST_LABEL 5
#define LOG_MAXLEN_CUST_LABEL 64
/// <summary>
/// log_options_set
/// </summary>
#define LOG_OPTION_INVALID -1 /* 无效选项 */
#define LOG_OPTION_OPEN_AND_CLOSE 1 /* 每次都打开日志、写日志、关闭日志 */ /* open , write , close log every time */
#define LOG_OPTION_CHANGE_TEST 2 /* 侦测文件变动 */ /* detect log changed and reopen it */
#define LOG_OPTION_OPEN_ONCE 4 /* 日志打开一次不关闭 */ /* open log once */
#define LOG_OPTION_SET_OUTPUT_BY_FILENAME 8 /* 自动根据文件名重置输出类型 */ /* reset log output type automatically */
/* "#stdout" -> LOG_OUTPUT_STDOUT */
/* "#stderr" -> LOG_OUTPUT_STDERR */
/* "#syslog" -> LOG_OUTPUT_SYSLOG */
#define LOG_OPTION_FILENAME_APPEND_DOT_LOG 16 /* 日志输出文件名后自动加上".log" */ /* append ".log" */
#define LOG_OPTION_OPEN_DEFAULT LOG_OPTION_CHANGE_TEST
typedef struct tagLOG LOG;
typedef struct tagLOGBUF LOGBUF;
/// <summary>
/// 日志文件操作函数指针
/// </summary>
typedef int funcOpenLog(LOG* g, char* log_pathfilename, void** open_handle);
typedef int funcWriteLog(LOG* g, void** open_handle, int log_level, char* buf, long len, long* writelen);
typedef int funcChangeTest(LOG* g, void** test_handle);
typedef int funcCloseLog(LOG* g, void** open_handle);
typedef int funcLogStyle(LOG* g, LOGBUF* logbuf, char* c_filename, long c_fileline, int log_level, char* format, va_list valist);
typedef int funcFilterLog(LOG* g, void** open_handle, int log_level, char* buf, long len);
typedef int funcBeforeRotateFile(LOG* g, char* rotate_log_pathfilename);
typedef int funcAfterRotateFile(LOG* g, char* rotate_log_pathfilename);
struct tagLOGBUF
{
long max_buf_size;
long buf_size;
char* bufbase;
char* bufptr;
long buf_remain_len;
};
struct tagLOG
{
int output;
char log_pathfilename[MAXLEN_FILENAME + 1];
funcOpenLog* pfuncOpenLogFirst;
funcOpenLog* pfuncOpenLog;
funcWriteLog* pfuncWriteLog;
funcChangeTest* pfuncChangeTest;
funcCloseLog* pfuncCloseLog;
funcCloseLog* pfuncCloseLogFinally;
void* open_handle;
void* test_handle;
int fd;
#if ( defined _WIN32 )
HANDLE hFile;
#endif
char open_flag;
int log_level;
funcFilterLog* pfuncFilterLog;
long log_styles;
funcLogStyle* pfuncLogStyle;
funcLogStyle* pfuncLogStyles[LOG_CUST_LABELS_COUNT];
int style_func_count;
int log_options;
long file_change_test_interval;
long file_change_test_no;
struct _stat file_change_stat;
long fsync_period;
long fsync_elapse;
char cust_label[LOG_MAXCNT_CUST_LABEL][LOG_MAXLEN_CUST_LABEL + 1];
int rotate_mode;
long log_rotate_size;
long rotate_file_no;
long rotate_file_count;
long pressure_factor;
long skip_count;
funcAfterRotateFile* pfuncAfterRotateFile;
funcBeforeRotateFile* pfuncBeforeRotateFile;
LOGBUF logbuf;
LOGBUF hexlogbuf;
struct timeval cache1_tv;
struct tm cache1_stime;
struct timeval cache2_logstyle_tv;
struct tm cache2_logstyle_stime;
char cache2_logstyle_date_buf[10 + 1];
long cache2_logstyle_date_buf_len;
char cache2_logstyle_datetime_buf[19 + 1];
long cache2_logstyle_datetime_buf_len;
unsigned long cache2_logstyle_pid;
char cache2_logstyle_pid_buf[20 + 1];
long cache2_logstyle_pid_buf_len;
unsigned long cache2_logstyle_tid;
char cache2_logstyle_tid_buf[20 + 1];
long cache2_logstyle_tid_buf_len;
struct timeval cache2_rotate_tv;
struct tm cache2_rotate_stime;
#if ( defined _WIN32 )
HANDLE rotate_lock;
#elif ( defined __unix ) || ( defined _AIX ) || ( defined __linux__ ) || ( defined __hpux )
int rotate_lock;
struct flock lock;
#endif
};
/// <summary>
/// 创建日志句柄
/// </summary>
/// <returns></returns>
typedef LOG* S_CreateLogHandle();
typedef void* S_DestroyLogHandle(LOG* g);
typedef LOG* S_logG_handle_create();
typedef void* S_logG_handle_destroy();
/// <summary>
/// 日志常规设置
/// </summary>
/// <param name="g"></param>
/// <param name="output"></param>
/// <param name="log_pathfilename"></param>
/// <param name="pfuncOpenLogFirst"></param>
/// <param name="pfuncOpenLog"></param>
/// <param name="pfuncWriteLog"></param>
/// <param name="pfuncChangeTest"></param>
/// <param name="pfuncCloseLog"></param>
/// <param name="pfuncCloseLogFinally"></param>
/// <returns></returns>
typedef int (*S_log_output_set)(LOG* , int , char* , funcOpenLog* , funcOpenLog* , funcWriteLog* , funcChangeTest* , funcCloseLog* , funcCloseLog* );
typedef int (*S_log_level_set)(LOG* , int );
typedef int (*S_log_style_set)(LOG* , long , funcLogStyle* );
typedef int (*S_logG_output_set)(int , char* , funcOpenLog* , funcOpenLog* , funcWriteLog* , funcChangeTest* , funcCloseLog* , funcCloseLog* );
typedef int (*S_logG_level_set)(int );
typedef int (*S_logG_style_set)(long , funcLogStyle* );
/// <summary>
/// 写普通日志函数
/// </summary>
/// <param name="g"></param>
/// <param name="c_filename"></param>
/// <param name="c_fileline"></param>
/// <param name="log_level"></param>
/// <param name="format"></param>
/// <param name=""></param>
/// <returns></returns>
typedef int (*S_log_level)(LOG* , char* , long , int , char* , ...);
typedef int (*S_log_debug)(LOG* , char* , long , char* , ...);
typedef int (*S_log_info)(LOG* , char* , long , char* , ...);
typedef int (*S_log_notice)(LOG* , char* , long , char* , ...);
typedef int (*S_log_warn)(LOG* , char* , long , char* , ...);
typedef int (*S_log_error)(LOG* , char* , long , char* , ...);
typedef int (*S_log_fatal)(LOG* , char* , long , char* , ...);
typedef int (*S_logG_level)(char* , long , int , char* , ...);
typedef int (*S_logG_debug)(char* , long , char* , ...);
typedef int (*S_logG_info)(char* , long , char* , ...);
typedef int (*S_logG_notice)(char* , long , char* , ...);
typedef int (*S_logG_warn)(char* , long , char* , ...);
typedef int (*S_logG_error)(char* , long , char* , ...);
typedef int (*S_logG_fatal)(char* , long , char* , ...);
/// <summary>
/// 写16进制日志函数
/// </summary>
/// <param name="g"></param>
/// <param name="c_filename"></param>
/// <param name="c_fileline"></param>
/// <param name="log_level"></param>
/// <param name="buffer"></param>
/// <param name="buflen"></param>
/// <param name="format"></param>
/// <param name=""></param>
/// <returns></returns>
typedef int (*S_log_hex_level)(LOG* , char* , long , int , char* , long , char* , ...);
typedef int (*S_log_hex_debug)(LOG* , char* , long , char* , long , char* , ...);
typedef int (*S_log_hex_info)(LOG* , char* , long , char* , long , char* , ...);
typedef int (*S_log_hex_notice)(LOG* , char* , long , char* , long , char* , ...);
typedef int (*S_log_hex_warn)(LOG* , char* , long , char* , long , char* , ...);
typedef int (*S_log_hex_error)(LOG* , char* , long , char* , long , char* , ...);
typedef int (*S_log_hex_fatal)(LOG* , char* , long , char* , long , char* , ...);
typedef int (*S_logG_hex_level)(char* , long , int , char* , long , char* , ...);
typedef int (*S_logG_hex_debug)(char* , long , char* , long , char* , ...);
typedef int (*S_logG_hex_info)(char* , long , char* , long , char* , ...);
typedef int (*S_logG_hex_notice)(char* , long , char* , long , char* , ...);
typedef int (*S_logG_hex_warn)(char* , long , char* , long , char* , ...);
typedef int (*S_logG_hex_error)(char* , long , char* , long , char* , ...);
typedef int (*S_logG_hex_fatal)(char* , long , char* , long , char* , ...);
/// <summary>
/// 高级日志设置
/// </summary>
/// <param name="g"></param>
/// <param name="log_options"></param>
/// <returns></returns>
typedef int (*S_log_options_set)(LOG* , int );
typedef int (*S_log_file_set)(LOG* , long );
typedef int (*S_log_sync_period_set)(LOG* , long );
typedef int (*S_log_cur_lable_set)(LOG* , int , char* );
typedef int (*S_log_rotate_mode_set)(LOG* , int );
typedef int (*S_log_rotate_size_set)(LOG* , long );
typedef int (*S_log_rotate_factor_set)(LOG* , long );
typedef int (*S_log_rotate_count_set)(LOG* , long );
typedef int (*S_log_rotate_before_set)(LOG* , funcBeforeRotateFile* );
typedef int (*S_log_rotate_after_set)(LOG* , funcAfterRotateFile* );
typedef int (*S_log_filter_set)(LOG* , funcFilterLog* );
typedef int (*S_log_buffer_set)(LOG* , long , long );
typedef int (*S_log_hexbuffer_set)(LOG* , long , long );
typedef int (*S_log_func_output_set)(LOG* , funcOpenLog* , funcOpenLog* , funcWriteLog* , funcChangeTest* , funcCloseLog* , funcCloseLog* );
typedef int (*S_log_func_style_set)(LOG* , funcLogStyle* );
typedef int (*S_logG_options_set)(int );
typedef int (*S_logG_file_set)(long );
typedef int (*S_logG_sync_period_set)(long );
typedef int (*S_logG_cur_lable_set)(int , char* );
typedef int (*S_logG_rotate_mode_set)(int );
typedef int (*S_logG_rotate_size_set)(long );
typedef int (*S_logG_rotate_factor_set)(long );
typedef int (*S_logG_rotate_count_set)(long );
typedef int (*S_logG_rotate_before_set)(funcBeforeRotateFile* );
typedef int (*S_logG_rotate_after_set)(funcAfterRotateFile* );
typedef int (*S_logG_filter_set)(funcFilterLog* );
typedef int (*S_logG_buffer_set)(long , long );
typedef int (*S_logG_hexbuffer_set)(long , long );
typedef int (*S_logG_func_output_set)(funcOpenLog* , funcOpenLog* , funcWriteLog* , funcChangeTest* , funcCloseLog* , funcCloseLog* );
typedef int (*S_logG_func_style_set)(funcLogStyle* );
#ifdef __cplusplus
}
#endif
#endif
#include <stdio.h>
#include <windows.h>
#include "dll.h"
static S_logG_output_set plogG_output_set ;
static S_logG_handle_create *plogG_handle_create = NULL;
static S_logG_handle_destroy *plogG_handle_destroy = NULL;
static S_logG_level_set plogG_level_set ;
static S_logG_style_set plogG_style_set ;
static S_logG_options_set plogG_options_set ;
static S_logG_rotate_mode_set plogG_rotate_mode_set ;
static S_logG_rotate_size_set plogG_rotate_size_set ;
static S_logG_hex_info plogG_hex_info ;
static S_logG_debug plogG_debug ;
int log_init(int log_level, int log_style, int log_rotatemode, long log_rotatemode_size) {
LOG* g = NULL;
int i = 0;
g = plogG_handle_create();
if (g == NULL) {
return -1;
}
plogG_output_set(LOG_OUTPUT_FILE, "dll_debug.log", LOG_NO_OUTPUTFUNC);
plogG_level_set(log_level);
plogG_style_set(log_style, LOG_NO_STYLEFUNC);
plogG_options_set(LOG_OPTION_OPEN_AND_CLOSE);
if (log_rotatemode) {
plogG_rotate_mode_set(log_rotatemode);
plogG_rotate_size_set(log_rotatemode_size);
}
return 0;
}
int main(){
char datain[20] = { 00,20,10,01,01,02,00,03,00,04,18,00,05,18,00,06,00,18,00,01 };
int datalem = 20;
int i = 0;
HMODULE hDll = LoadLibrary("log.dll");
if (hDll != NULL){
plogG_output_set = (S_logG_output_set)GetProcAddress(hDll, "logG_output_set");
plogG_handle_create = (S_logG_handle_create*)GetProcAddress(hDll, "logG_handle_create");
plogG_handle_destroy = (S_logG_handle_destroy*)GetProcAddress(hDll, "logG_handle_destroy");
plogG_level_set = (S_logG_level_set)GetProcAddress(hDll, "logG_level_set");
plogG_style_set = (S_logG_style_set)GetProcAddress(hDll, "logG_style_set");
plogG_options_set = (S_logG_options_set)GetProcAddress(hDll, "logG_options_set");
plogG_rotate_mode_set = (S_logG_rotate_mode_set)GetProcAddress(hDll, "logG_rotate_mode_set");
plogG_rotate_size_set = (S_logG_rotate_size_set)GetProcAddress(hDll, "logG_rotate_size_set");
plogG_hex_info = (S_logG_hex_info)GetProcAddress(hDll, "logG_hex_info");
plogG_debug = (S_logG_debug)GetProcAddress(hDll, "logG_debug");
}
log_init(LOG_LEVEL_DEBUG, LOG_STYLE_DATETIMEMS | LOG_STYLE_LOGLEVEL | LOG_STYLE_FORMAT | LOG_STYLE_SOURCE, LOG_ROTATEMODE_SIZE, 1024 * 1024 * 4);
plogG_debug(__FILE__, __LINE__, "dll log_init\n");
for (i = 0; i < 20000; i++) {
plogG_hex_info(__FILE__, __LINE__, datain, datalem, "<- ");
}
plogG_debug(__FILE__, __LINE__, "dll example run ok!\n");
return 0;
}