首先感谢作者
https://github.com/armink/EasyLogger
EasyLogger
简介
EasyLogger是一款超轻量级(ROM<1.6K, RAM<0.3K)、高性能的 C/C++ 日志库,非常适合对资源敏感的软件项目,例如: IoT 产品、可穿戴设备、智能家居等等。相比 log4c、zlog 这些知名的 C/C++ 日志库, EasyLogger 的功能更加简单,提供给用户的接口更少,但上手会很快,更多实用功能支持以插件形式进行动态扩展
裸机移植
移植条件:
- N32L406
- MDK5
- 源码地址:https://github.com/armink/EasyLogger
源码目录
复制文件到工程目录middle下
加入文件到工程
这里的elog_demo.c时我自己添加
工程添加头文件
…\middle\easylogger\inc
在elog_port.c修改各个接口文件
#include "elog.h"
#include <stdio.h>
/**
* EasyLogger port initialize
* 初始化,这里可以是串口的初始化,也可以是文件打开
* @return result
*/
ElogErrCode elog_port_init(void) {
ElogErrCode result = ELOG_NO_ERR;
return result;
}
/*
手动添加卸载函数,原本这里没有这个接口函数
*/
ElogErrCode elog_port_deinit(void)
{
ElogErrCode result = ELOG_NO_ERR;
return result;
}
/**
* output log port interface
* 日志输出,可以到串口,可以到文件
* @param log output of log
* @param size log size
*/
void elog_port_output(const char *log, size_t size) {
/* output to terminal */
printf("%.*s", size, log);//这里是实现了fputc函数,将数据输出到串口中
//TODO output to flash
}
/**
* output lock
输出加锁函数
*/
void elog_port_output_lock(void) {
__disable_irq();
}
/**
* output unlock
输出解锁函数
*/
void elog_port_output_unlock(void) {
__enable_irq();
}
/**
* get current time interface
*获取系统时间
* @return current time
*/
const char *elog_port_get_time(void) {
return "10:08:12";
}
/**
* get current process name interface
*获取进程信息
* @return current process name
*/
const char *elog_port_get_p_info(void) {
return "pid:1008";
}
/**
* get current thread name interface
*获取线程信息
* @return current thread name
*/
const char *elog_port_get_t_info(void) {
return "tid:24";
}
添加用户配置
在elog.h 文件中添加
#include <elog_cfg.h>
在elog_cfg.h中可以设置一些参数
#ifndef _ELOG_CFG_H_
#define _ELOG_CFG_H_
/* 日志输出使能 enable log output. default open this macro */
#define ELOG_OUTPUT_ENABLE
/* 输出日志等级 setting static output log level */
#define ELOG_OUTPUT_LVL ELOG_LVL_VERBOSE
/* enable assert check */
#define ELOG_ASSERT_ENABLE
/* 每一行日志的缓存大小 buffer size for every line's log */
#define ELOG_LINE_BUF_SIZE 256
/* output line number max length */
#define ELOG_LINE_NUM_MAX_LEN 5
/* 过滤标签最大长度output filter's tag max length */
#define ELOG_FILTER_TAG_MAX_LEN 16
/* 过滤关键词长度output filter's keyword max length */
#define ELOG_FILTER_KW_MAX_LEN 16
/* 过滤标签最大数量output filter's tag level max num */
#define ELOG_FILTER_TAG_LVL_MAX_NUM 5
/* 换行符output newline sign */
#define ELOG_NEWLINE_SIGN "\r\n"
/*---------------------------------------------------------------------------*/
/* 日志颜色输出使能 enable log color */
#define ELOG_COLOR_ENABLE
/* 指定某等级输出的日志字体颜色,背景颜色,文字风格*/
#define ELOG_COLOR_ASSERT (F_MAGENTA B_NULL S_NORMAL)
#define ELOG_COLOR_ERROR (F_RED B_WHITE S_BOLD)
#define ELOG_COLOR_WARN (F_YELLOW B_NULL S_NORMAL)
#define ELOG_COLOR_INFO (F_CYAN B_NULL S_NORMAL)
#define ELOG_COLOR_DEBUG (F_GREEN B_NULL S_NORMAL)
#define ELOG_COLOR_VERBOSE (F_RED B_NULL S_NORMAL)
/*---------------------------------------------------------------------------*/
/* enable asynchronous output mode */
//#define ELOG_ASYNC_OUTPUT_ENABLE
/* the highest output level for async mode, other level will sync output */
//#define ELOG_ASYNC_OUTPUT_LVL ELOG_LVL_ASSERT
/* buffer size for asynchronous output mode */
//#define ELOG_ASYNC_OUTPUT_BUF_SIZE (ELOG_LINE_BUF_SIZE * 10)
/* each asynchronous output's log which must end with newline sign */
//#define ELOG_ASYNC_LINE_OUTPUT
/* asynchronous output mode using POSIX pthread implementation */
//#define ELOG_ASYNC_OUTPUT_USING_PTHREAD
/*---------------------------------------------------------------------------*/
/* enable buffered output mode */
//#define ELOG_BUF_OUTPUT_ENABLE
/* buffer size for buffered output mode */
//#define ELOG_BUF_OUTPUT_BUF_SIZE (ELOG_LINE_BUF_SIZE * 10)
#endif /* _ELOG_CFG_H_ */
字体颜色
/* 输出日志字体颜色output log front color */
#define F_BLACK “30;”
#define F_RED “31;”
#define F_GREEN “32;”
#define F_YELLOW “33;”
#define F_BLUE “34;”
#define F_MAGENTA “35;”
#define F_CYAN “36;”
#define F_WHITE “37;”
输出背景色
/* 输出日志背景色output log background color */
#define B_NULL
#define B_BLACK “40;”
#define B_RED “41;”
#define B_GREEN “42;”
#define B_YELLOW “43;”
#define B_BLUE “44;”
#define B_MAGENTA “45;”
#define B_CYAN “46;”
#define B_WHITE “47;”
输出文字风格
/* 输出日志字体风格 output log fonts style */
#define S_BOLD “1m”
#define S_UNDERLINE “4m”
#define S_BLINK “5m”
#define S_NORMAL “22m”
测试
#include "elog.h"
#include <stdio.h>
void elog_demo (void)
{
/* 初始化 EasyLogger */
elog_init();
/* 修改日志输出格式*/
elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_ALL);
elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_DIR);
elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_DIR);
elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL | ELOG_FMT_TAG | ELOG_FMT_DIR);
elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_ALL & ~(ELOG_FMT_FUNC ));
elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_ALL & ~(ELOG_FMT_FUNC | ELOG_FMT_T_INFO | ELOG_FMT_P_INFO));
/* 开始 EasyLogger */
elog_start();
/* dynamic set enable or disable for output logs (true or false) */
// elog_set_output_enabled(false);
/* dynamic set output logs's level (from ELOG_LVL_ASSERT to ELOG_LVL_VERBOSE) */
// elog_set_filter_lvl(ELOG_LVL_WARN);
/* dynamic set output logs's filter for tag */
// elog_set_filter_tag("main");
/* dynamic set output logs's filter for keyword */
elog_set_filter_kw("Hello");//这里就是输出带有Hello的行日志
/* dynamic set output logs's tag filter */
// elog_set_filter_tag_lvl("main", ELOG_LVL_WARN);
log_a("Hello EasyLogger!");
log_e("Hello EasyLogger!");
log_w("Hello EasyLogger!");
log_i("log EasyLogger!");
log_d("Hello EasyLogger!");
log_v("Hello EasyLogger!");
}
hex输出测试
char buff[10];
for(int i=0;i<10;i++)
{
buff[i]=i;
}
elog_hexdump(“hex”,10 ,buff,10);