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

news2024/9/20 14:25:15

首先感谢作者

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1967676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

掌握录屏软件的快捷录制技巧!2024最新推荐这四款屏幕录制软件~

你是否曾希望捕捉电脑屏幕上的精彩瞬间&#xff1f;无论是游戏剪辑、教学视频还是会议记录&#xff0c;屏幕录制已成为我们数字生活中不可或缺的一部分。 面对屏幕录制的挑战&#xff0c;选择一款合适的录屏软件至关重要。市场上的录屏软件种类繁多&#xff0c;从专业级到用户…

应用地址信息获取新技巧:Xinstall来助力

在移动互联网时代&#xff0c;应用获取用户地址信息的需求越来越普遍。无论是为了提供个性化服务&#xff0c;还是进行精准营销&#xff0c;地址信息都扮演着至关重要的角色。然而&#xff0c;如何合规、准确地获取这一信息&#xff0c;却是许多开发者面临的挑战。今天&#xf…

如何选择最佳Mac数据恢复程序?10大 Mac 数据恢复软件评测

当您的手机或相机已满时&#xff0c;Mac 将成为存储您的照片、视频、音乐和其他重要数据的数据管理器。 然而&#xff0c;一旦珍贵的数据因为意外删除或未知原因而丢失&#xff0c;您一定会感到非常难过。 幸运的是&#xff0c;这篇文章收集了适用于 Mac 的最佳数据恢复软件。…

超声波眼镜清洗机哪款好用?品质上等的超声波清洗机评选

对于佩戴眼镜的人来说&#xff0c;眼镜清洁是一个必须面对的问题。然而&#xff0c;简单地用眼镜布擦拭并不能彻底清洁眼镜&#xff0c;这种方法不仅可能无法清除所有的视力&#xff0c;还容易划伤镜片表面。相比之下&#xff0c;超声波清洗机的作用非常显着。它采用了不直接接…

[ACTF2020 新生赛]BackupFile1

打开题目 利用disearch扫描&#xff0c;发现源文件index.php.bak 下载下来 打开文件 代码审计&#xff0c;翻译一下 翻译代码为&#xff1a; <?php include_once "flag.php"; //这一行使用 include_once 函数来包含&#xff08;或插入&#xff09;另一个 PHP …

RabbitMQ docker部署,并启用MQTT协议

在Docker中部署RabbitMQ容器并启用MQTT插件的步骤如下&#xff1a; 一、准备工作 安装Docker&#xff1a; 确保系统上已安装Docker。Docker是一个开源的容器化平台&#xff0c;允许以容器的方式运行应用程序。可以在Docker官方网站上找到适合操作系统的安装包&#xff0c;并…

xalpha,一个神奇的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个神奇的 Python 库 - xalpha。 Github地址&#xff1a;https://github.com/refraction-ray/xalpha 在投资和金融分析领域&#xff0c;Python 语言因其强大的数据处理能力和…

集成经验模态分解 (EEMD) 及其在信号降噪中的应用

引言 在信号处理领域&#xff0c;处理非线性和非平稳信号是一个重要的挑战。经验模态分解 (EMD) 是一种有效的方法&#xff0c;但在处理带噪声的信号时&#xff0c;可能会出现模态混叠问题。集成经验模态分解 (Ensemble Empirical Mode Decomposition, EEMD) 作为EMD的改进方法…

Go语言+Vue3零基础入门全栈班09 Go语言+MongoDB开发用户管理系统API实战_20240730 课程笔记

概述 如果您没有Golang的基础&#xff0c;应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728Go语言操作MySQL开发用户管理系统API教程_20240729Redis零基础快速入门_20231227GoRedis开发用户管理系统API实战_20240730Mo…

PG如何实现跨大版本升级

数据库进行升级&#xff0c;是一个再正常不过的功能&#xff0c;比如功能的需要&#xff0c;遇到BUG&#xff0c;安全漏洞等等&#xff0c;具体升级包含子版本升级&#xff0c;主版本升级。如果用过ORACLE的朋友&#xff0c;一定知道&#xff0c;在ORACLE中&#xff0c;如果要实…

dp:221. 最大正方形

221. 最大正方形 看到这个题目真能立马想到dp吗&#xff1f;貌似很难&#xff0c;即使知道是一个dp题也很难想到解法。 直观来看&#xff0c;使用bfs以一个点为中点进行遍历&#xff0c;需要的时间复杂度为 O ( n 2 m 2 ) O(n^2m^2) O(n2m2) 但是可以很容易发现&#xff0c;…

昂科烧录器支持MindMotion灵动微电子的32位微控制器MM32SPIN360C

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中MindMotion灵动微电子的32位微控制器MM32SPIN360C已经被昂科的通用烧录平台AP8000所支持。 MM32SPIN360C使用高性能的ARM CortexM0为内核的32位微控制器&#xff0c;5V输出的L…

九大原则,轻松构建个人高效SOP

1、原则一、工作汇报SOP SCQA模型(升职加薪的关键!&#xff09; 清晰定义问题和提出解决方案 类别 关键词 解读 S - Situation 情景 陈述项目背景&#xff0c;目标&#xff0c;愿景 C - Complication 冲突 讲卡点&#xff0c;讲冲突 Q - Question 疑问-问题 这些冲…

vue2 封装插槽组件

安装 element-ui npm install element-ui --save ---force main.js 导入 import Vue from vue; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; import App from ./App.vue; Vue.use(ElementUI); new Vue({ el: #app, render: h > h(Ap…

未来RPA财税的发展前景

近年来&#xff0c;全球数字化进程持续提速&#xff0c;越来越多企业受到效率及运营成本的压力&#xff0c;正努力寻求企业增长发展的新路径&#xff0c;而财务作为企业战略的“大脑”&#xff0c;成为企业数字化转型的重要突破口。RPA技术由于能够自动化各种重复性和繁琐的任务…

如何利用智能电子工牌提高酒店员工的服务技能和沟通效率?

智能电子语音工牌的基本功能 智能电子录音工牌通常集成了录音、语音识别、数据上传等功能&#xff0c;能够在员工与客户互动的过程中实时录制音频&#xff0c;并将数据上传到云端服务器。这些工牌还可能配备定位功能&#xff0c;以便追踪员工的位置和服务轨迹。通过语音识别技…

职场里有3个错觉,如果正好说中你,抓紧醒过来

1.没有我肯定不行。 其实大多数公司里的绝大多数人都可以被替代&#xff0c;无非是在个体层面替代的成本高一点、低一点罢了。 所以千万别高估自己&#xff0c;否则会造成极其严重的误判。 我之前的公司有一个部门&#xff0c;这里面有个员工&#xff0c;专业对口&#xff0…

vue-cli搭建项目笔记

1. 在指定位置打开终端 2. 运行 指令 vue create xtx选择 vue2 等待创建完成。。。。。 大概5.52s完成 3.启动项目 进入 项目 目录 cd xtx 启动 yarn run serve 4. 访问 浏览器 访问 localhost:8080 5. 项目开发 清空项目 App.vue 注意&#xff1a;每一个vue组件中的…

柯桥零基础学韩语韩语俗语韩语日常口语培训

반모반말모드 반말모드 非敬语模式 존모존댓말모드 존댓말모드 敬语模式 2 비담 비담비주얼담당 비주얼 담당, 意思就是颜值担当。 3 보배 보배보조배터리15857575376# 随身充、充电宝 如果单讲单词&#xff0c;是宝贝的意思。网络用语角度理解的话就是充电宝 4 삼귀다…

这4个思维导图软件剪辑就是整理思维的魔法工具。

思维导图作为一个能够帮助我们呈现可视化内容&#xff0c;激发创意以及提高我们记忆力的工具&#xff1b;正在被越来越多的人使用。然而选择一款适合自己的脑图软件&#xff0c;会为我们的学习、工作和生活带来很大的便利&#xff0c;如果你依旧还在寻找的话&#xff0c;不妨看…