简单的LOG日志输出

发布于 2022-07-19  556 次阅读


基于freertos的异步输出方式,支持多个日志等级,支持彩色日志,支持自定义结尾符号

#include "lwlog.h"

#include "main.h"


typedef struct
{
	char  *plwLogBuf;
	uint16_t plwLogBufSize;
	void  (*lwlog_buff_send)(char *, uint16_t);
}lwlog_t;

static lwlog_t *gLwlog = NULL;

/** 函数名:lwlog_init
  * 功能	:
  * 输入	:
	* 输出	:
	* 编写人:XMW
  */
void lwlog_init(void *lgOut, unsigned short int size)
{
	gLwlog = pvPortMalloc(sizeof(lwlog_t));
	
	if(gLwlog == NULL)
	{
		goto exit;
	}
	gLwlog->plwLogBufSize = size;
	gLwlog->plwLogBuf = pvPortMalloc(size +1);
	if(gLwlog->plwLogBuf == NULL)
	{
		goto exit;
	}
	gLwlog->plwLogBuf[size] = '\0';
	gLwlog->lwlog_buff_send = lgOut;
	lwlog_emerg("lwlog success");	
	return;
exit:
	if(gLwlog != NULL)
	{
		if(gLwlog->plwLogBuf != NULL)
			vPortFree(gLwlog->plwLogBuf);
		vPortFree(gLwlog);
	}
}

/** 函数名:lwlog_deinit
  * 功能	:
  * 输入	:
	* 输出	:
	* 编写人:XMW
  */
void lwlog_deinit(void)
{
	if(gLwlog != NULL)
	{
		if(gLwlog->plwLogBuf != NULL)
			vPortFree(gLwlog->plwLogBuf);
		vPortFree(gLwlog);
	}
}

/** 函数名:lwlog_printf
  * 功能	:
  * 输入	:
	* 输出	:
	* 编写人:XMW
  */
void lwlog_printf(char *format, ...)
{
	if(gLwlog == NULL )
	{
		return;
	}
	int length;
	va_list   v_args;
	va_start(v_args, format);
	length = vsnprintf((char       *)gLwlog->plwLogBuf,
								 (size_t      ) gLwlog->plwLogBufSize,
								 (char const *) format,
																v_args);
	if(gLwlog->plwLogBufSize > length)
	{
		gLwlog->lwlog_buff_send(gLwlog->plwLogBuf, strlen(gLwlog->plwLogBuf)+1);
	}
	va_end(v_args);
}

/*
 * @file lwlog.h
 * @auther Akagi201
 *
 * @date 2014/11/30
 */

#ifndef LWLOG_H_
#define LWLOG_H_ (1)

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


// log levels the same as syslog
#define NOLOG 	(0)
#define EMERG 	(1)
#define ALERT 	(2)
#define CRIT 		(3)
#define ERR 		(4)
#define WARNING (5)
#define NOTICE 	(6)
#define INFO 		(7)
#define DEBUG 	(8)

#ifndef LOG_LEVEL
#define LOG_LEVEL (DEBUG)
#endif

#ifndef LOG_COLOR
#define LOG_COLOR (0)
#endif

#ifndef LOG_ENTER
#define LOG_ENTER "\n"
#endif


// colors
#define NONE                 "\e[0m"
#define BLACK                "\e[0;30m"
#define L_BLACK              "\e[1;30m"
#define RED                  "\e[0;31m"
#define L_RED                "\e[1;31m"
#define GREEN                "\e[0;32m"
#define L_GREEN              "\e[1;32m"
#define BROWN                "\e[0;33m"
#define YELLOW               "\e[1;33m"
#define BLUE                 "\e[0;34m"
#define L_BLUE               "\e[1;34m"
#define PURPLE               "\e[0;35m"
#define L_PURPLE             "\e[1;35m"
#define CYAN                 "\e[0;36m"
#define L_CYAN               "\e[1;36m"
#define GRAY                 "\e[0;37m"
#define WHITE                "\e[1;37m"

#define BOLD                 "\e[1m"
#define UNDERLINE            "\e[4m"
#define BLINK                "\e[5m"
#define REVERSE              "\e[7m"
#define HIDE                 "\e[8m"
#define CLEAR                "\e[2J"
#define CLRLINE              "\r\e[K" //or "\e[1K\r"

#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)

/* safe readable version of errno */
#define clean_errno() (errno == 0 ? "None" : strerror(errno))

#define lwlog_emerg(M, ...)   lwlog_printf(RED    "[EMERG]   " "%s (%s:%d) " NONE M LOG_ENTER, __func__, __FILE__, __LINE__, ##__VA_ARGS__);
#define lwlog_alert(M, ...)   lwlog_printf(PURPLE "[ALERT]   " "%s (%s:%d) " NONE M LOG_ENTER, __func__, __FILE__, __LINE__, ##__VA_ARGS__);
#define lwlog_crit(M, ...)    lwlog_printf(YELLOW "[CRIT]    " "%s (%s:%d) " NONE M LOG_ENTER, __func__, __FILE__, __LINE__, ##__VA_ARGS__);
#define lwlog_err(M, ...)     lwlog_printf(BROWN  "[ERR]     " "%s (%s:%d) " NONE M LOG_ENTER, __func__, __FILE__, __LINE__, ##__VA_ARGS__);
#define lwlog_warning(M, ...) lwlog_printf(BLUE   "[WARNING] " "%s (%s:%d) " NONE M LOG_ENTER, __func__, __FILE__, __LINE__, ##__VA_ARGS__);
#define lwlog_notice(M, ...)  lwlog_printf(CYAN   "[NOTICE]  " "%s (%s:%d) " NONE M LOG_ENTER, __func__, __FILE__, __LINE__, ##__VA_ARGS__);
#define lwlog_info(M, ...)    lwlog_printf(GREEN  "[INFO]    " "%s (%s:%d) " NONE M LOG_ENTER, __func__, __FILE__, __LINE__, ##__VA_ARGS__);
#define lwlog_debug(M, ...)   lwlog_printf(GRAY   "[DEBUG]   " "%s (%s:%d) " NONE M LOG_ENTER, __func__, __FILE__, __LINE__, ##__VA_ARGS__);

/* LOG_LEVEL controls */
#if LOG_LEVEL < DEBUG
#undef lwlog_debug
#define lwlog_debug(M, ...) do{}while(0)
#endif

#if LOG_LEVEL < INFO
#undef lwlog_info
#define lwlog_info(M, ...) do{}while(0)
#endif

#if LOG_LEVEL < NOTICE
#undef lwlog_notice
#define lwlog_notice(M, ...) do{}while(0)
#endif

#if LOG_LEVEL < WARNING
#undef lwlog_warning
#define lwlog_warning(M, ...) do{}while(0)
#endif

#if LOG_LEVEL < ERR
#undef lwlog_err
#define lwlog_err(M, ...) do{}while(0)
#endif

#if LOG_LEVEL < CRIT
#undef lwlog_crit
#define lwlog_crit(M, ...) do{}while(0)
#endif

#if LOG_LEVEL < ALERT
#undef lwlog_alert
#define lwlog_alert(M, ...) do{}while(0)
#endif

#if LOG_LEVEL < EMERG
#undef lwlog_emerg
#define lwlog_emerg(M, ...) do{}while(0)
#endif

/* LOG_COLOR controls */
#if LOG_COLOR < 1

#undef NONE
#define NONE

#undef RED
#define RED

#undef PURPLE
#define PURPLE

#undef YELLOW
#define YELLOW

#undef BROWN
#define BROWN

#undef GREEN
#define GREEN

#undef CYAN
#define CYAN

#undef BLUE
#define BLUE

#undef GRAY
#define GRAY

#endif




void lwlog_printf(char *format, ...);
void lwlog_init(void *lgOut, unsigned short int size);
void lwlog_deinit(void);

#endif // LWLOG_H_

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。