1、在项目的运行过程中需要记录或现实代码的执行流程和错误信息,但在不同的阶段需要的功能不同:
调试阶段:需要在屏幕显示执行过程和错误信息
运营阶段:需要在文件中记录下来执行过程和错误信息
2、根据错误原因一般段错误分为收下四个等级:
致命错误 LOG_FATAL
警告 LOG_WARNING
错误 LOG_ERROR
提示信息 LOG_INFO
3、如何实现文件和终端都可写入的?
因为在Linux系统下一切皆文件,终端的文件指针就是stdout。
使用fprintf和FILE可以实现既可以现实到屏幕,也可以记录到文件。
4、如何区分调试还是运行?
使用#ifdef 判断DEBUG宏是否定义来判断。
DEBUG宏既可以在代码中通过#define来定义,也可以在编译中使用 -D 定义。
5、如何让宏函数想printf一样可以参数自动化?
使用宏函数的变长参数…,配合格式控制 ##VA_ARGS 获取宏函数的参数。
6、要注意的问题?
1、一定要调用初始化函数
2、日志的级别,LOG_FATAL < LOG_WARNING < LOG_ERROR < LOG_INFO 级别越高显示的内容越多,级别越低现实的内容越重要。
log.h头文件
#ifndef LOG_H
#define LOG_H
#include <stdio.h>
//日志级别
typedef enum LogLevel
{
LOG_FATAL = 1,
LOG_ERROR = 2,
LOG_WARNING = 3,
LOG_INFO = 4
}LogLevel;
//记录用户设置的日志级别的全局变量
extern LogLevel log_level;
//日志文件的文件指针
extern FILE* ffp;
extern FILE* wfp;
extern FILE* efp;
extern FILE* ifp;
//初始化日志
void log_init(const char* log_path,const char* program,LogLevel level);
#define flog(fmt,...)\
{\
if(log_level >= LOG_FATAL)\
{\
fprintf(ffp,"FILE:%s Line:%u Fatal:",__FILE__,__LINE__);\
fprintf(ffp,fmt,##__VA_ARGS__);\
}\
}\
#define elog(fmt,...)\
{\
if(log_level >= LOG_ERROR)\
{\
fprintf(efp,"FILE:%s Line:%u Error:",__FILE__,__LINE__);\
fprintf(efp,fmt,##__VA_ARGS__);\
}\
}\
#define wlog(fmt,...)\
{\
if(log_level >= LOG_WARNING)\
{\
fprintf(wfp,"FILE:%s Line:%u Warning:",__FILE__,__LINE__);\
fprintf(wfp,fmt,##__VA_ARGS__);\
}\
}\
#define ilog(fmt,...)\
{\
if(log_level >= LOG_INFO)\
{\
fprintf(ifp,"FILE:%s Line:%u Info:",__FILE__,__LINE__);\
fprintf(ifp,fmt,##__VA_ARGS__);\
}\
}\
#endif//LOG_H
log.c源文件
#include "log.h"
#include <limits.h>
//记录用户设置的日志级别的全局变量
LogLevel log_level;
//日志文件的文件指针
FILE* ffp;
FILE* wfp;
FILE* efp;
FILE* ifp;
//初始化日志
void log_init(const char* log_path,const char* program,LogLevel level)
{
log_level = level;
#ifdef DEBUG
ffp = stdout;
wfp = stdout;
efp = stdout;
ifp = stdout;
#else
char path[PATH_MAX] = {};
sprintf(path,"%s/%s_fatal.log",log_path,program);
ffp = fopen(path,"a");
sprintf(path,"%s/%s_error.log",log_path,program);
efp = fopen(path,"a");
sprintf(path,"%s/%s_warning.log",log_path,program);
wfp = fopen(path,"a");
sprintf(path,"%s/%s_info.log",log_path,program);
ifp = fopen(path,"a");
#endif
}
测试代码
#include <stdio.h>
#include "log.h"
int main(int argc,const char* argv[])
{
log_init(".",argv[0],LOG_INFO);
flog("hehe %d\n",1234);
elog("xixi %d\n",4567);
wlog("haha %u\n",6789);
ilog("lala %d\n",9000);
}