错误日志的添加,每个日志的大小为1M,循环30次。

//定义

const DWORD  g_errlog_file_size =  1024*1024;//1M

const DWORD  g_errlog_file_num = 30;//file num
DWORD 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);

已经试用,东西比较简单,没有做成大型的日志。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值