本文说明如何进行运行时日志消息过滤。
在Zephyr通过编译时过滤可以限制模块最小的过滤等级,但在最小等级之上的模块日志还是会输出。我们在调试时希望控制相关模块日志进行输出分析,不希望其它无关的日志都输出,这种情况下需要在运行时可以设置模块的日志过滤等级。需要注意的是运行时过滤的等级只能大于或者等于编译时指定的过滤等级。
代码控制过滤等级
运行时过滤提供了过滤日志更多的灵活性,让我们在代码里面可以根据触发条件对日志过滤等级进行修改,更方便调试。
控制运行时日志使用的接口都在头文件include/logging/log_ctrl.h
中声明,设置过滤等级的函数为log_filter_set
。示例代码logging_sample.c
中logging_filter_test
函数演示了如何使用log_filter_set
进行过滤:
1 | /* 获取source id的函数需要自己实现 */ |
log_filter_set
的level
参数可选如下,返回值为实际实际生效
1 |
log_filter_set
的返回值为实际生效的等级,当level
设置的等级低于编译时等级时,将按照编译时默认等级进行设置生效。
通过Shell命令控制日志系统
当启用zephyr shell命令时,可以通过shell的log命令进行日志过滤等级设置,后端设置,状态查看等。log支持的命令如下
1 | uart:~$ log help |
举例演示如下:
将simple模块的日志过滤等级设置为INFO:
log enable inf simple
将simple模块的日志过滤等级设置为DEBUG:
log enable dbg simple
关闭simple模块的日志:
log disable simple
查看日志系统内存使用情况:
log mem
查看日志各模块的过滤状态:
log status
显示如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21uart:~$ log status
module_name | current | built-in
----------------------------------------------------------
esp_timer | inf | inf
flash_esp32 | inf | dbg
fs_nvs | inf | dbg
gpio_esp32 | inf | inf
i2c | inf | inf
i2c_esp32 | inf | inf
i2c_shell | inf | inf
intc_esp32c3 | inf | inf
log | inf | inf
logging_sample | wrn | inf
module_inst | inf | dbg
module_inst.inst0 | inf | inf
module_inst.inst1 | inf | inf
module_inst.inst2 | inf | inf
os | inf | inf
shell.shell_uart | inf | inf
shell_uart | inf | inf
simple | inf | inf
这里current表示为当前设置的过滤等级,build-in为编译时设置的过滤等级。过滤等级上current不能低于build-in。
中断所有后端日志输出:
log halt
恢复所有后端日志输出:
log resume
参考
https://docs.zephyrproject.org/latest/services/logging/index.html