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

程序调试日志,,可以 通过printf直接输出到屏幕上面进行调试。在默写特定的情况下面,可以将日志保存到文件中,后期进行查阅调试。

log.h

//log.h#ifndef _ITCAST_LOG_H_#define _ITCAST_LOG_H_/*#define IC_NO_LOG_LEVEL0#define IC_DEBUG_LEVEL1#define IC_INFO_LEVEL2#define IC_WARNING_LEVEL3#define IC_ERROR_LEVEL4;*//************************************************************************//*const char *file:文件名称int line:文件行号int level:错误级别0 — 没有日志1 — debug级别2 — info级别3 — warning级别4 — err级别int status:错误码const char *fmt:可变参数*//************************************************************************///实际使用的Levelextern int LogLevel[5];void ITCAST_LOG(const char *file, int line, int level, int status, const char *fmt, …);#endif

log.c

//log.c#define _CRT_SECURE_NO_WARNINGS#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdarg.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#include "ItcastLog.h"#define ITCAST_DEBUG_FILE_"socketclient.log"#define ITCAST_MAX_STRING_LEN 10240//Level类别#define IC_NO_LOG_LEVEL0#define IC_DEBUG_LEVEL1#define IC_INFO_LEVEL2#define IC_WARNING_LEVEL3#define IC_ERROR_LEVEL4int 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_ttimeLen = 0;time_ttTime = 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(int* pf){charfileName[1024];memset(fileName, 0, sizeof(fileName));#ifdef WIN32sprintf(fileName, "c:\\debuglog\\%s", ITCAST_DEBUG_FILE_);//log文件路径#elsesprintf(fileName, "%s/log/%s", getenv("HOME"), ITCAST_DEBUG_FILE_);#endif*pf = open(fileName, O_WRONLY | O_CREAT | O_APPEND, 0666);if (*pf < 0){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;int pf = 0;//初始化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(&pf)){return;}//写入LOG文件write(pf, str, strLen);//IC_Log_Error_WriteFile(str);//关闭文件close(pf);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");}

当你成功得意的时候,最重要的是瞧得起别人。

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

相关文章:

你感兴趣的文章:

标签云: