自定义log日志输出到文件中保存

//log.h
#pragma once


/*
 #define IC_NO_LOG_LEVEL     0
 #define IC_DEBUG_LEVEL      1
 #define IC_INFO_LEVEL       2
 #define IC_WARNING_LEVEL    3
 #define IC_ERROR_LEVEL      4
*/


/***************************************************/
/*
const char *file: 文件名称
int line:文件行号
int level:错误级别
0 -- 没有日子
1 -- debug级别
2 -- info级别
3 -- warning级别
4 -- err级别
int status:错误码
const char *fmt:可变参数
*/
/***************************************************/
//实际使用的Level
extern int logLevel[5];

void ITCAST_LOG(const char *file, int level, int status,const char *fmt, ...);


//log.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
#include<string.h>
#include<time.h>
#include "log.h"


#define ITCAST_DEBUG_FILE_ "socketclient.log"
#define ITCAST_MAX_STRING_LEN 10240
//Level类别
#define IC_NO_LOG_LEVEL     0
#define IC_DEBUG_LEVEL      1
#define IC_INFO_LEVEL       2
#define IC_WARNING_LEVEL    3
#define IC_ERROR_LEVEL      4


int logLevel[5] = {IC_NO_LOG_LEVEL, IC_DEBUG_LEVEL, IC_INFO_LEVEL, IC_WARNING_LEVEL, IC_ERROR_LEVEL};
//Level的名称
char ICLevelName[5][10] = {"NOLOG", "DEBUG", "INFO", "WARNING", "ERROR"};


static int ITCAST_Error_GetCurTime(char *strTime)
{
    struct tm* tmTime = NULL;
size_t timeLen = 0;
time_t tTime = 0;


tTime = time(NULL);
tmTime = localtime(&tTime);
//timelen = strftime(strTime, 33, "%Y(Y)%m(M)%d(D)%H(H)%M(M)%S(S)", tmTime);
timeLen = strftime(strTime, 33, "%Y.%m.%d %H:%M:%S", tmTime);  

return timeLen;
}


static int ITCAST_Error_OpenFile(FILE** fp)
{
    char  fileName[1024];


memset(fileName, 0, sizeof(fileName));
/*
#ifdef WIN32
sprintf(fileName, "c:/debuglog/%s",ITCAST_DEBUG_FILE_); //log文件路径
#else
sprintf(fileName,"%s/log/%s", getenv("HOME"),ITCAST_DEBUG_FILE_);
#endif
*/
//*pf = open(fileName, O_WRONLY | O_CREAT | O_APPEND, 0666);
//只写 若欲打开的文件不存在则自动建立该文件 当读写文件时会从文件尾开始移动, 也就是所写入的数据会以附加的方式加入到文件后面.
sprintf(fileName,"log/%s",ITCAST_DEBUG_FILE_);
*fp = fopen(fileName,"a");
if(*fp == NULL)
{
   return -1;
}


return 0;
}


static void ITCAST_Error_Core(const char *file, int line, int level, int status, const char *fmt, va_list args)  
{  
    char str[ITCAST_MAX_STRING_LEN];  
    int  strLen = 0;  
    char tmpStr[64];  
    int  tmpStrLen = 0;  
    FILE *fp = NULL;  
  
    //初始化  
    memset(str, 0, ITCAST_MAX_STRING_LEN);  
    memset(tmpStr, 0, 64);  
  
    //加入LOG时间  
    tmpStrLen = ITCAST_Error_GetCurTime(tmpStr);  
    tmpStrLen = sprintf(str, "[%s] ", tmpStr);  
    strLen = tmpStrLen;  
  
    //加入LOG等级  
    tmpStrLen = sprintf(str + strLen, "[%s] ", ICLevelName[level]);  
    strLen += tmpStrLen;  
  
    //加入LOG状态  
    if (status != 0)  
    {  
        tmpStrLen = sprintf(str + strLen, "[ERRNO is %d] ", status);  
    }  
    else  
    {  
        tmpStrLen = sprintf(str + strLen, "[SUCCESS] ");  
    }  
    strLen += tmpStrLen;  
  
    //加入LOG信息  
    tmpStrLen = vsprintf(str + strLen, fmt, args);  
    strLen += tmpStrLen;  
  
    //加入LOG发生文件  
    tmpStrLen = sprintf(str + strLen, " [%s]", file);  
    strLen += tmpStrLen;  
  
    //加入LOG发生行数  
    tmpStrLen = sprintf(str + strLen, " [%d]\n", line);  
    strLen += tmpStrLen;  
  
    //打开LOG文件  
    if (ITCAST_Error_OpenFile(&fp))  
    {  
        return;  
    }  
  
    //写入LOG文件  
    fwrite(str, strLen, 1, fp);  
    //IC_Log_Error_WriteFile(str);  
  
    //关闭文件  
    fclose(fp);  
  
    return;  
}  
  
  
void ITCAST_LOG(const char *file, int line, int level, int status, const char *fmt, ...)  
{  
    va_list args;  
  
    //判断是否需要写LOG  
    //  if(level!=IC_DEBUG_LEVEL && level!=IC_INFO_LEVEL && level!=IC_WARNING_LEVEL && level!=IC_ERROR_LEVEL)  
    if (level == IC_NO_LOG_LEVEL)  
    {  
        return;  
    }  
  
    //调用核心的写LOG函数  
    va_start(args, fmt);  
    ITCAST_Error_Core(file, line, level, status, fmt, args);  
    va_end(args);  
  
    return;  
}  


void main()  
{  
    int rv = -3;  
    ITCAST_LOG(__FILE__, __LINE__, logLevel[4], rv, "func cltSocketRev2: (buflen == NULL) [%d]", rv);  
    system("pause");  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值