【25】用户态下分级别打印日志和把日志打印进文件

linux kernel内核可以按日志级别打印,但是用户态下没有这种接口,这样调试的日志需要在release版本删除,以后再想调试又要加回来比较麻烦。写了一个用户态的按级别打印的小demo,仅供娱乐。
PS:比较懒,其实mian函数之上,放到.h文件更好一下,这样其他函数直接包含该头文件就可以使用了。如果想要改变打印出来的module的name 只要在自己app的头文件的#define MODULENAME “moduleA” 就可以把pcieteset的打印改成moduleA了

#include <stdio.h>
#include <string.h>

#ifndef MODULENAME
#define MODULENAME "pcieteset"
#endif

/* log level,
 * if default_level is LOG_DISABLE, no log is allowed output,
 * if default_level is LOG_ERR, only ERR is allowed output,
 * if default_level is LOG_WARNING, only ERR and WARNING is allowed output,
 * if default_level is LOG_INFO, ERR/WARNING and INFO are allowed output,
 * if default_level is LOG_DEBUG, all log are allowed output*/

enum log_level {
    LOG_DISABLE = 0,
    LOG_ERR = 1,
	LOG_WARNING = 2,
    LOG_INFO = 3,
    LOG_DEBUG = 4,
    LOG_BUTT = 5,
};

/* the macro to set debug level, you should call it 
 * once in the files you need use debug system*/
static enum log_level default_level = LOG_BUTT;
#define SET_DEFAULT_LEVEL(level)  (default_level = level)
/*print log on console*/
#define CONSOLE_PERR(format, ...)						\
do {													\
	if (default_level >= LOG_ERR)						\
	{													\
		printf( "[%s File:%s, Func:%s, Line:%d] [\033[31mERR\033[0m]: "format".\n", MODULENAME, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);	\
	}													\
} while (0)

#define CONSOLE_PWARN(format, ...)						\
do {													\
	if (default_level >= LOG_WARNING)					\
	{													\
		printf( "[%s File:%s, Func:%s, Line:%d] [\033[31mWARN\033[0m]: "format".\n", MODULENAME, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);	\
	}													\
} while (0)

#define CONSOLE_PINFO(format, ...)						\
do {													\
	if (default_level >= LOG_INFO)						\
	{													\
		printf( "[%s File:%s, Func:%s, Line:%d] [\033[31mINFO\033[0m]: "format".\n", MODULENAME, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);	\
	}													\
} while (0)

#define CONSOLE_PDBG(format, ...)						\
do {													\
	if (default_level >= LOG_DEBUG)						\
	{													\
		printf( "[%s File:%s, Func:%s, Line:%d] [\033[31mDBG\033[0m]: "format".\n", MODULENAME, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);	\
	}													\
} while (0)

/*save log to file*/
#define LOG_FILE "/tmp/"
#define LOG_BUFFER_MAX (4096)
#define LOG2FILE(format, ...)							\
{														\
	char buffer[LOG_BUFFER_MAX+1]={0};					\
	char filename[LOG_BUFFER_MAX+1]={0};				\
	snprintf(filename, LOG_BUFFER_MAX, "%s%s",LOG_FILE, MODULENAME);	\
	snprintf( buffer, LOG_BUFFER_MAX, "[%s File:%s, Func:%s, Line:%d]: "format"}\n", MODULENAME, __FILE__,__FUNCTION__, __LINE__,##__VA_ARGS__);	\
	FILE* fd = fopen(filename, "a");					\
	if ( fd != NULL )									\
	{													\
		fwrite( buffer, strlen(buffer), 1, fd );		\
		fflush( fd );									\
		fclose( fd );									\
	}													\
}

int main ()
{
	int data = 999;
	int data2 = 666;
	SET_DEFAULT_LEVEL(LOG_INFO);
    CONSOLE_PERR( "11data = %d data2 = %d", data ,data2);
	CONSOLE_PWARN( "22data = %d data2 = %d", data ,data2);
	CONSOLE_PINFO( "33data = %d data2 = %d", data ,data2);	
	CONSOLE_PDBG( "44data = %d data2 = %d", data ,data2);
	LOG2FILE("data = %d ata2 = %d", data ,data2);
    return 0;
}

在这里插入图片描述

发布了33 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/linjiasen/article/details/92830752
今日推荐