//定义
const DWORD g_errlog_file_size = 1024*1024;//1M
const DWORD g_errlog_file_num = 30;//file numDWORD current_file_num = 1;
DWORD g_current_log_size = 0;
FILE *g_errlog_file = NULL;
void errlog_open(DWORD num,BOOL bStartOpen = FALSE);
void errlog_write(char *str, int ilen);
void errlog_close();
//index logfile 日志索引文件,当有系统退出时,下一次启动的起点。。
FILE *g_err_index_log_file = NULL;
void index_log_open(int type);
void index_log_write(DWORD num);
DWORD index_log_read();
void index_log_close();
void errlog_open(DWORD errlog_num, BOOL bStartOpen)
{
char chPath[DCF_DIR_FPLEN_MAX] = { 0 };
if (!chPath[0])
{
char temp[16];
sprintf_s(temp, 16, "err_log_%d.log",errlog_num);
dcf_dir_get_filepath(DIR_LOG, chPath,temp);
}
if (g_errlog_file)
{
fclose(g_errlog_file);
g_errlog_file = NULL;
}
if (bStartOpen)
{
g_errlog_file = fopen(chPath, "ab+");
if (fseek(g_errlog_file, 0, SEEK_END) == 0)
{
g_current_log_size = ftell(g_errlog_file);
if (g_current_log_size < 0)
{
g_current_log_size = 0;
}
}
}
else
{
g_errlog_file = fopen(chPath, "wb");
}
//覆盖写索引到index_log
dcf_err_index_log_open(2);
dcf_err_index_log_write(errlog_num);
dcf_err_index_log_close();
}
void errlog_write(char *str, int ilen) //外部调用接口
{
if ((!g_errlog_file) || (!(*str)) || (ilen <= 0))
{
return;
}
g_current_log_size += ilen;
if (g_current_log_size > g_errlog_file_size)
{
current_file_num++;
if (current_file_num > g_errlog_file_num)
{
current_file_num %= g_errlog_file_num;
}
//关掉之前的文件
errlog_close();
errlog_open(current_file_num);
g_current_log_size = 0;
}
fwrite(str, 1, ilen, g_errlog_file);
fflush(g_errlog_file);
}
void errlog_close()
{
if (!g_errlog_file)
{
return;
}
fclose(g_errlog_file);
g_errlog_file = NULL;
}
//1 readonly ; 2 write only
void dcf_err_index_log_open(int type)
{
char chPath[DCF_DIR_FPLEN_MAX] = { 0 };
dcf_dir_get_filepath(DIR_LOG, chPath, "err_log_index.txt");
if (g_err_index_log_file)
{
fclose(g_err_index_log_file);
g_err_index_log_file = NULL;
}
if (type == 1)
{
g_err_index_log_file = fopen(chPath, "rb");
}
else if (type == 2)
{
g_err_index_log_file = fopen(chPath, "wb");
}
}
void index_log_write(DWORD num)
{
ASSERT((num >= 1) && (num <= g_errlog_file_num));
if (!g_err_index_log_file)
{
return;
}
char str_index[4];
int ilen = sprintf_s(str_index, sizeof(str_index), "%d", num);
fwrite(str_index, 1, ilen, g_err_index_log_file);
fflush(g_err_index_log_file);
}
DWORD index_log_read()
{
if ((!g_err_index_log_file)) return 1;
char str_index[4] = {0};
size_t a = fread(str_index, sizeof(str_index), 1, g_err_index_log_file);
int idx = atoi(str_index);
if ((idx < 1) || (idx > g_errlog_file_num))
{
idx = 1;
}
return idx;
}
void index_log_close()
{
if (!g_err_index_log_file)
{
return;
}
fclose(g_err_index_log_file);
g_err_index_log_file = NULL;
}
//初始化接口
err_index_log_open(1);
current_file_num = dcf_err_index_log_read();
errlog_open(current_file_num,TRUE);
err_index_log_open(2);
已经试用,东西比较简单,没有做成大型的日志。。