C语言 的log模版

 一个自制的log模版

日志要考虑多进程互斥问题,否则日志会被重复覆盖。

log.h

#ifndef _LOG_H_
#define _LOG_H_

 
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <Windows.h>

#ifdef __cplusplus
extern "C" {
#endif


	int write_log(const char * filename, void * data, int ret);

	int append_file(const char *filename, void *data, int data_length);

	int append_filei64(char * file_name, char * data_tmp, size_t data_size);


	
#ifdef __cplusplus
}
#endif

#endif// _LOG_H_

 log.c

#include "log.h"


#pragma warning(disable : 4996)

// 临界区数据
static CRITICAL_SECTION csRecvRead = { 0 };

//全局锁
static int g_bool_f_cri_init = 0;

enum LOG_ERROR
{
	LOG_ERROR_FILE_WRITERN,
	LOG_ERROR_FILE_SEEK,
	LOG_ERROR_FILE_FLUSH,
	LOG_ERROR_FILE_CLOSE,
};

/*
* 写日志: 记录事件时间,启动线程,日志信息和返回值,情况可自行修改
*/
int write_log(const char *filename, void *data, int ret)
{
	time_t cur_time;
	static time_t limit_time = 0;
	char buff[1024] = { 0 };

	char s[32];
	time(&cur_time);//记录时间

	strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&cur_time));
	sprintf(buff, "[LOG]time:%s,\tthread id:%d,\treturn value: 0x%08X,\t%s\n", s, GetCurrentThreadId(), ret, data);
	append_file(filename, buff, strlen(buff));
}

/*
* 日志追加
* 参数:文件名,字符串,字符串长度
*/
int append_file(const char *filename, void *data, int data_length)
{
	FILE *fp = NULL;
	size_t fsize = 0;
	int ret = 0;

	if (g_bool_f_cri_init == 0)
	{
		InitializeCriticalSection(&csRecvRead);// 临界区初始化
		g_bool_f_cri_init++;
	}
	EnterCriticalSection(&csRecvRead);// 使用临界区变量
	fp = fopen(filename, "ab");
	if (fp == NULL)
	{
		return -1;
	}
	ret = fseek(fp, 0, SEEK_END);
	if (ret != 0)
	{
		return LOG_ERROR_FILE_SEEK;
	}
	ret = fwrite(data, 1, data_length, fp);
	if (fsize == -1)
	{
		return LOG_ERROR_FILE_WRITERN;
	}
	ret = fflush(fp);
	if (ret != 0)
	{
		return LOG_ERROR_FILE_FLUSH;
	}
	ret = fclose(fp);
	if (ret == EOF)
	{
		return LOG_ERROR_FILE_CLOSE;
	}
	LeaveCriticalSection(&csRecvRead);
	return 0;
}
/*
* 日志追加 x64
* 参数:文件名,字符串,字符串长度
*/
int append_filei64(char * file_name, char * data_tmp, size_t data_size)
{
	FILE *fp = NULL;
	size_t ret = 0;
	size_t fsize = 0;
	static LPCRITICAL_SECTION file_lock = { 0 };
	static int is_file_lock_inited = 0;

	if (is_file_lock_inited == 0)
	{
		InitializeCriticalSection(file_lock);
		is_file_lock_inited++;
	}
	EnterCriticalSection(&file_lock);

	// read file data
	fp = fopen(file_name, "ab+");

	ret = _fseeki64(fp, 0, SEEK_END);
	if (ret != 0)
	{
		return LOG_ERROR_FILE_SEEK;
	}
	fsize = fwrite(data_tmp, 1, data_size, fp);
	if (fsize == -1)
	{
		return LOG_ERROR_FILE_WRITERN;
	}
	// 写入磁盘
	ret = fflush(fp);
	if (ret != 0)
	{
		return LOG_ERROR_FILE_FLUSH;
	}
	ret = fclose(fp);
	if (ret == EOF)
	{
		return LOG_ERROR_FILE_CLOSE;
	}

	LeaveCriticalSection(&file_lock);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值