您的位置:首页 > 其它

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

2017-08-30 19:59 183 查看
//定义

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

已经试用,东西比较简单,没有做成大型的日志。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐