基于C/C++的最高效的C语言日志,每秒可记录1W+条日志记录

本文介绍了一个适用于Windows平台的高效C/C++日志记录库,支持多种日志级别、输出方式及风格定制。该库还具备日志文件轮转功能,并提供了丰富的API供开发者进行灵活配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ya土豆儿~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值