Zephyr日志使用指南-模块日志

Creative Commons
本作品采用知识共享署名

本文说明如何使用Zephyr日志系统中的模块日志。

Zephyr拥有强大的日志系统,模块日志是其最基本的功能。模块日志可以将一个或几个文件当作一个模块,在这些文件中的日志消息输出时都有相同的模块标签和相同的日志过滤等级。

基本的使用方法

首先在prj.conf中开启日志系统

1
CONFIG_LOG=y

代码中通过下面两步就可以

  1. 在模块文件中使用LOG_MODULE_REGISTER进行注册
  2. 使用LOG_*LOG_HEXDUMP_*进行日志记录

示例代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <logging/log.h>
// 注册simple模块
LOG_MODULE_REGISTER(simple, 4);

void simple_logging(void)
{

uint8_t data[] = { 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32,
33, 34, };

// 以不同等级输出日志
LOG_ERR("Error message example.");
LOG_WRN("Warning message example.");
LOG_INF("Info message example.");
LOG_DBG("Debug message example.");

//Dump二进制数据
LOG_HEXDUMP_ERR(data, sizeof(data),"Error hexdump example:");
}

其输出结果为

1
2
3
4
5
6
7
8
[00:06:30.554,273] <err> simple: Error message example.
[00:06:30.554,300] <wrn> simple: Warning message example.
[00:06:30.554,309] <inf> simple: Info message example.
[00:06:30.554,322] <dbg> simple: simple_logging: Debug message example.
[00:00:25.371,571] <err> simple: Error hexdump example:
01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 |........ ........
11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |........ .......
21 22 |!"

如果同时要在其它文件也使用simple作为模块标签,按照下面方法使用LOG_MODULE_DECLARE声明模块后即可使用

1
2
3
4
5
6
7
8
9
10
#include <logging/log.h>
LOG_MODULE_DECLARE(simple);

void simple_co_logging(void)
{
LOG_ERR("Error message example co.");
LOG_WRN("Warning message example co.");
LOG_INF("Info message example co.");
LOG_DBG("Debug message example co.");
}

接口简要说明

LOG_MODULE_REGISTER是可变参宏,第一个参数是模块名标签,上例为simple。第二个参数表示该模块的build-in日志等级,该参数是可选的,上例是4代表build-in日志等级为DEBUG。如果不指定LOG_MODULE_REGISTER(simple)就是默认为3代表为INFO等级。
当有多个文件属于同一个模块时,只能在一个文件中使用LOG_MODULE_REGISTER注册模块,其它文件使用LOG_MODULE_DECLARE进行模块声明,这样这些文件就属于同一个模块。
开发者可以使用以下接口进行日志输出。

模块日志输出,格式化输出字符串到日志系统,参数格式和printf一致,格式化字符串符合C99规定的标准。模块日志输出的宏会自动在字符串末尾加入\r\n

1
2
3
4
LOG_ERR(...)
LOG_WRN(...)
LOG_INF(...)
LOG_DBG(...)

模块日志输出,原始数据16进制输出到日志系统

1
2
3
4
LOG_HEXDUMP_ERR(_data, _length, _str)
LOG_HEXDUMP_WRN(_data, _length, _str)
LOG_HEXDUMP_INF(_data, _length, _str)
LOG_HEXDUMP_DBG(_data, _length, _str)

_data 为要输出的原始数据,_length为原始数据的长度,_str为提示字符串。会将_data内的数据以16进制的形式输出,并显示其对应的ascii码。
以上四种类型的宏分别对应4个严重等级的消息:

  • *_ERR :ERROR消息,指示严重错误,例如无法恢复的错误。输出消息中会带有”err”字符串标签。
  • *_WRN :WARNING消息,指示不严重的异常情况。输出消息中会带有”wrn”字符串标签。
  • *_INF :INFO消息,指示一般的信息。输出消息中会带有”inf”字符串标签。
  • *_DBG :DEBUG消息,调试信息。输出消息中会带有”dbg”字符串标签。

参考

https://docs.zephyrproject.org/latest/services/logging/index.html