基于N32L406的EasyLogger日志库移植教程

server/2024/9/25 4:16:58/

首先感谢作者

https://github.com/armink/EasyLogger

EasyLogger_6">EasyLogger

简介

EasyLogger是一款超轻量级(ROM<1.6K, RAM<0.3K)、高性能的 C/C++ 日志库,非常适合对资源敏感的软件项目,例如: IoT 产品、可穿戴设备、智能家居等等。相比 log4c、zlog 这些知名的 C/C++ 日志库, 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);

在这里插入图片描述


http://www.ppmy.cn/server/93506.html

相关文章

Spring源码- context:component-scan base-package标签的作用源码解析

1.扫描包路径下所有的类加载解析成bean定义信息 ClassPathBeanDefinitionScanner .doScan方法调用路径 doScan:276, ClassPathBeanDefinitionScanner (org.springframework.context.annotation) parse:95, ComponentScanBeanDefinitionParser (org.springframework.context.a…

ChinaJoy 2024,VERYCLOUD睿鸿股份与你相聚

&#x1f3ae;2024 ChinaJoy于26日正式开幕 &#x1f557;7月26-28日 &#x1f310;VERYCLOUD睿鸿股份在BTOB商务洽谈馆 &#x1f31f;W4-B785展位 &#x1f387;展台交流好礼相送 与多行业好友现场相聚、畅谈&#x1f9d0; 现场游戏企业云集 专业观众、玩家纷至沓来 与游戏/短…

George Danezis谈Mysticeti的共识性能

Sui的新共识引擎Mysticeti已经在主网上开始分阶段推出。Mysten Labs联合创始人兼首席科学家George Danezis在采访中&#xff0c;讨论了其低延迟如何通过高性能应用程序提升用户体验。 采访视频&#xff1a; https://youtu.be/WHvtPQUa2Q0 中文译文&#xff1a;延迟和吞吐量对…

超市是怎样高效完成客流统计与客流分析

随着科技的进步&#xff0c;越来越多的超市开始采用现代化的客流统计系统来优化日常运营和提升顾客体验。本文将探讨超市客流统计面临的难题、客流统计系统的构成及其应用场景&#xff0c;以及系统如何通过高识别率和热力图分析等功能为超市带来实际效益。 一、景区客流统计难题…

Springcloud物流配送后台-计算机毕业设计源码69809

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 物流配送后台系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2 数据修改流程 2.2.3 数据…

【C++笔试强训】day05

游游的you 思路 贪心&#xff1a;优先组成 you&#xff0c;最少的字母决定了you的数量。需要注意&#xff1a;如果oo剩下n个&#xff0c;那么相邻oo的个数是n-1个&#xff0c;而不是n/2个。 例如 oooooo oo oo oooo oo 6个o&#xff0c;两两组合有3对&#xff0c;掐头去尾有…

Mojo AI编程语言(十六)库与框架:扩展Mojo功能

目录 1. 库与框架的定义与作用 1.1 库 1.2 框架 2. Mojo中的库与框架 2.1 标准库 2.1.1 数据结构 2.1.2 算法 2.1.3 输入输出 2.2 第三方库 2.2.1 数据处理 2.2.2 机器学习 2.3 框架 2.3.1 Flask 2.3.2 Django 3. 案例 3.1 项目需求 3.2 数据准备 3.3 模型训…

Kafka 为什么这么快的七大秘诀,涨知识了

我们都知道 Kafka 是基于磁盘进行存储的&#xff0c;但 Kafka 官方又称其具有高性能、高吞吐、低延时的特点&#xff0c;其吞吐量动辄几十上百万。 在座的靓仔和靓女们是不是有点困惑了&#xff0c;一般认为在磁盘上读写数据是会降低性能的&#xff0c;因为寻址会比较消耗时间。…