之所以能做到快速查看,是因为 dpdk 的日志模块提供了便利的使用方式。面向 dpdk 的开发者,提供了日志打印的注册功能,面向普通用户,提供了修改日志打印等级的功能。
以 ixgbe 为例,该驱动的开发者通过多次调用 RTE_LOG_REGISTER() 宏注册了若干个日志打印等级(不太好描述,暂且这样称呼),如下所示:
RTE_LOG_REGISTER(ixgbe_logtype_init, pmd.net.ixgbe.init, NOTICE);
RTE_LOG_REGISTER(ixgbe_logtype_driver, pmd.net.ixgbe.driver, NOTICE);
#ifdef RTE_LIBRTE_IXGBE_DEBUG_RX
RTE_LOG_REGISTER(ixgbe_logtype_rx, pmd.net.ixgbe.rx, DEBUG);
#endif
#ifdef RTE_LIBRTE_IXGBE_DEBUG_TX
RTE_LOG_REGISTER(ixgbe_logtype_tx, pmd.net.ixgbe.tx, DEBUG);
#endif
#ifdef RTE_LIBRTE_IXGBE_DEBUG_TX_FREE
RTE_LOG_REGISTER(ixgbe_logtype_tx_free, pmd.net.ixgbe.tx_free, DEBUG);
#endif
从变量的命名可以猜到,之所以有多个日志等级,是因为他们分别对应不同的业务处理阶段,比如 pmd.net.ixgbe.init 主要用来控制 ixgbe 驱动中与初始化相关的日志打印等级。
日志打印通过调用 PMD_INIT_LOG() 宏来实现。从上面的代码可以看到,pmd.net.ixgbe.init 的日志打印等级是 NOTICE,因此,调用 PMD_INIT_LOG() 时,如果传入的日志打印等级低于 NOTICE,则该调用产生的日志信息将不会被打印。
此时,用户可以通过在 EAL 命令行参数中添加 "--log-level=pmd.net.ixgbe.init:8" 来实现对 pmd.net.ixgbe.init 日志等级的修改,其中 8 表示将日志等级设置为 DEBUG,优先级大于等于 DEBUG 的日志都会被打印。
这样修改后,ixgbe 驱动中 PMD_INIT_LOG() 调用产生的日志都可以被打印出来了。其他的日志等级也可以参照此方法进行修改,是不是很方便!
使用 “--log-level=help” 可以查看当前 DPDK 支持哪些日志类别,如下所示:
$ ./build/app/dpdk-testpmd -l 0-3 --log-level=help
Log type is a pattern matching items of this list (plugins may be missing):
bus.auxiliary
bus.dpaa
bus.fslmc
bus.ifpga
bus.vdev
bus.vmbus
lib.acl
lib.bbdev
lib.bpf
lib.cfgfile
...