c++实现log日志文件

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);
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值