基于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_

Comments | NOTHING