当前位置: 首页 > news >正文

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

首先感谢作者

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);

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue如何在axios.js中跳转页面(解决办法)
  • LeetCode541 反转字符串 II
  • Java----反射
  • 英伟达推出新中国特供版芯片B20:挑战与机遇并存
  • OD C卷 - 王者荣耀游戏分组
  • 顺序表,链表,顺序栈,顺序循环队列,链式队列的基本操作
  • 为什么说脱离决策的数据分析都是无用功
  • 【AI落地应用实战】DAMODEL深度学习平台部署+本地调用ChatGLM-6B解决方案
  • Android Java和Kotlin的目标JVM版本不一致
  • 数据炼金术:在sklearn中进行增量特征合成的秘诀
  • 弱网常见问题
  • 25考研计算机组成原理复习·3.1/3.2 存储器概述/主存储器
  • Hugo 部署与自动更新(Git)
  • c#中Oracle.DataAccess.dll连接数据库的报错处理
  • TiDB系列之:TiCDC同步TiDB数据库数据到Kafka集群Topic
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【node学习】协程
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • IndexedDB
  • js 实现textarea输入字数提示
  • js递归,无限分级树形折叠菜单
  • js写一个简单的选项卡
  • MYSQL 的 IF 函数
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • PHP 7 修改了什么呢 -- 2
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Xmanager 远程桌面 CentOS 7
  • 从0到1:PostCSS 插件开发最佳实践
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​油烟净化器电源安全,保障健康餐饮生活
  • ‌移动管家手机智能控制汽车系统
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • %check_box% in rails :coditions={:has_many , :through}
  • (20050108)又读《平凡的世界》
  • (ros//EnvironmentVariables)ros环境变量
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (六)激光线扫描-三维重建
  • (排序详解之 堆排序)
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .a文件和.so文件
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net Signalr 使用笔记
  • .net 按比例显示图片的缩略图
  • .Net 垃圾回收机制原理(二)
  • .NET 中 GetProcess 相关方法的性能
  • .Net多线程Threading相关详解
  • .NET使用存储过程实现对数据库的增删改查
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • .stream().map与.stream().flatMap的使用