From 3c01950d3faa04f7345aa3ecae84b0d24d5e6c51 Mon Sep 17 00:00:00 2001 From: wdfk-prog <1425075683@qq.com> Date: Sun, 29 Jan 2023 13:29:12 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ULOG=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=9A=84=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wdfk-prog <1425075683@qq.com> --- .../programming-manual/ulog/ulog.md | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/rt-thread-version/rt-thread-standard/programming-manual/ulog/ulog.md b/rt-thread-version/rt-thread-standard/programming-manual/ulog/ulog.md index 659632a..0770ed6 100644 --- a/rt-thread-version/rt-thread-standard/programming-manual/ulog/ulog.md +++ b/rt-thread-version/rt-thread-standard/programming-manual/ulog/ulog.md @@ -402,6 +402,110 @@ struct ulog_backend * `flush` 也是可选择性实现,一些内部输出带缓存的后端需要必须实现该接口 。比如一些带RAM 缓存的文件系统。后端的 flush 一般会在断言、hardfault 等异常情况下由 `ulog_flush` 完成调用。 +##### 文件后端注册示例 + +如下代码将实现一个文件后端的实现示例,将输出日志保存至文件系统路径`/flash/log`中. +详细介绍 +> https://club.rt-thread.org/ask/article/73cedec4f1707abf.html + +```c +#include + +/* +* 后端注册表 +*/ +struct _log_file +{ + const char *name; //文件名 + ulog_backend_t backend; + struct ulog_file_be *file_be; + const char *dir_path; //保存路径 + rt_size_t max_num; //保存最大文件数量 + rt_size_t max_size; //保存最大文件大小 + rt_size_t buf_size; //文件保存缓存大小 +}; +/* +* 文件后端标识 +*/ +typedef enum +{ + console_id, + sys_id, + motion_id, +}ulog_file_be_name; + +#define ROOT_PATH "/flash/log" //设置保存路径 +#define FILE_SIZE 512 * 1024 //设置单个文件大小 +#define BUFF_SIZE 512 //设备缓存区大小 + +static struct ulog_backend sys_log_backend; +static struct ulog_file_be sys_log_file; + +static struct _log_file table[] = +{ + {"sys" ,&sys_log_backend,&sys_log_file,ROOT_PATH,10,FILE_SIZE,BUFF_SIZE}, +}; +/* Private function prototypes -----------------------------------------------*/ +/** + * @brief 系统日志文件后端初始化. + * @param None. + * @retval None. + * @note None. +*/ +void sys_log_file_backend_init(void) +{ + struct ulog_file_be *file_be = &sys_log_file; + uint8_t id = sys_id; + file_be->parent = sys_log_backend; + + ulog_file_backend_init( file_be, + table[id].name, + table[id].dir_path, + table[id].max_num, + table[id].max_size, + table[id].buf_size); + + ulog_file_backend_enable(file_be); //必须使能才能有效 +} +``` + +添加如下代码实现文件后端滤波功能. + +```c +/** + * @brief 系统日志文件后端滤波器设置. + * @param None. + * @retval The filter will be call before output. It will return TRUE when the filter condition is math. + * @note None. +*/ +static rt_bool_t sys_log_file_backend_filter(struct ulog_backend *backend, rt_uint32_t level, const char *tag, rt_bool_t is_raw, + const char *log, rt_size_t len) +{ + //设置滤波规则,可以自己编写代码实现不同滤波规则 + if (rt_strncmp(tag,MOTION_TAG, sizeof(MOTION_TAG)) == 0)//排除带有"MOVE"标签输出 + return RT_FALSE; + else + return RT_TRUE; + + //if (rt_strncmp(tag,MOTION_TAG, sizeof(MOTION_TAG)) == 0)//带有"MOVE"标签输出 + // return RT_TRUE; + //else + // return RT_FALSE; +} + +void sys_log_file_backend_init(void) +{ + //新增代码 + ulog_backend_filter_t filter = sys_log_file_backend_filter; + + ... + + ulog_file_backend_enable(file_be); + //新增代码 + ulog_backend_set_filter(&file_be->parent,filter); +} +``` + ### 异步日志 在 ulog 中,默认的输出模式是同步模式,在很多场景下用户可能还需要异步模式。用户在调用日志输出 API 时,会将日志缓存到缓冲区中,会有专门负责日志输出的线程取出日志,然后输出到后端。 -- Gitee