一个自制的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;
}