对vpp自带的log模块了解很少,但是功能开发总是因为log的缺失导致问题很多定位。所以有必要了解一下log模块的记录。
- unix 字段下log:
unix {
nodaemon
log /var/log/vpp/vpp.log
full-coredump
cli-listen /run/vpp/cli.sock
gid vpp
startup-config /etc/vpp/start.txt
}
这个log应该记录的是vppctl命令行所有操作信息,在定位一些配置下发过程引发的问题时,比较有用。
默认在系统/var/log并没有vpp的目录。需要自己手动创建一个,否则在启动时会报下面的错误,导致不会记录日志。
代码语言:javascript复制unix_config:463: couldn't open log '/var/log/vpp/vpp.log'
#文件夹记录日志举例。
2020/09/28 20:42:10:859: ***** Start: PID 23450 *****
2020/09/28 20:42:13:039: ***** Startup Config *****
set interface sta eth0 up
set interface l2 learn eth0
set interface promiscuous on eth0
set interface ip addr eth0 192.168.1.1/24
set interface sta eth1 up
set interface l2 learn eth1
set interface promiscuous on eth1
set interface ip addr eth1 192.168.2.1/24
2020/09/28 20:42:13:039: ***** End Startup Config *****
- logging 字段
logging {
default-log-level info
default-syslog-log-level info
}
设置系统日志的默认日志级别:
代码语言:javascript复制default-log-level emerg|alert | crit | err | warn | notice | info | debug | disabled
设置syslog目标的默认日志记录级别:
代码语言:javascript复制default-syslog-log-level emerg|alert | crit | err | warn | notice | info | debug | disabled
在vpp命令行可以通过show logging configure来查询设置情况:
在命令行通过show logging 记录当前最新的日志信息:
代码语言:javascript复制show logging 会记录当前的有一些信息
2020/09/28 20:42:11:321 warn dpdk EAL init args: -c 7e -n 4 --in-memory --file-prefix vpp -w 0000:01:00.0 -w 0000:01:00.1 --master-lcore 1
2020/09/28 20:42:11:739 notice dpdk DPDK drivers found 2 ports...
2020/09/28 20:42:11:757 info dpdk qinq strip soft offload enabled for interface
2020/09/28 20:42:11:774 info dpdk qinq strip soft offload enabled for interface
2020/09/28 20:42:11:779 notice dpdk EAL: Detected 12 lcore(s)
- logging模块使用事例 下面是每个消息对应的宏定义
#define vlib_log_emerg(...) vlib_log(VLIB_LOG_LEVEL_EMERG, __VA_ARGS__)
#define vlib_log_alert(...) vlib_log(VLIB_LOG_LEVEL_ALERT, __VA_ARGS__)
#define vlib_log_crit(...) vlib_log(VLIB_LOG_LEVEL_CRIT, __VA_ARGS__)
#define vlib_log_err(...) vlib_log(VLIB_LOG_LEVEL_ERR, __VA_ARGS__)
#define vlib_log_warn(...) vlib_log(VLIB_LOG_LEVEL_WARNING, __VA_ARGS__)
#define vlib_log_notice(...) vlib_log(VLIB_LOG_LEVEL_NOTICE, __VA_ARGS__)
#define vlib_log_info(...) vlib_log(VLIB_LOG_LEVEL_INFO, __VA_ARGS__)
#define vlib_log_debug(...) vlib_log(VLIB_LOG_LEVEL_DEBUG, __VA_ARGS__
以dpdk模块举例如何使用:
1、 注册dpdk logging模块。
在文件src/plugins/dpdk/device/init.c中的dpdk_init函数注册dpdk模块,没有设置子模块。默认是50/s。也可以自己指定
代码语言:javascript复制 dm->log_default = vlib_log_register_class ("dpdk", 0);
注册并指定设置每秒记录条数
代码语言:javascript复制pm->logger =
vlib_log_register_class_rate_limit ("plugin", "load",
0x7FFFFFFF /* aka no rate limit */ )
2、定义自己模块对应的level的接口函数
代码语言:javascript复制#define dpdk_log_err(...)
vlib_log(VLIB_LOG_LEVEL_ERR, dpdk_main.log_default, __VA_ARGS__)
#define dpdk_log_warn(...)
vlib_log(VLIB_LOG_LEVEL_WARNING, dpdk_main.log_default, __VA_ARGS__)
#define dpdk_log_notice(...)
vlib_log(VLIB_LOG_LEVEL_NOTICE, dpdk_main.log_default, __VA_ARGS__)
#define dpdk_log_info(...)
vlib_log(VLIB_LOG_LEVEL_INFO, dpdk_main.log_default, __VA_ARGS__
3、代码中使用,就ok了
下面是vlan strip功能设置信息。我们可以使用show logging可以看到启动后的打印。
代码语言:javascript复制 if (devconf->vlan_strip_offload == DPDK_DEVICE_VLAN_STRIP_ON)
{
vlan_off |= ETH_VLAN_STRIP_OFFLOAD;
if (rte_eth_dev_set_vlan_offload (xd->port_id, vlan_off) >= 0)
dpdk_log_info ("VLAN strip enabled for interfacen");
else
dpdk_log_warn ("VLAN strip cannot be supported by interfacen");
}
- 总结 本文简单介绍了vpp 日志记录使用的,当然还有一个elog模块。这个模块相对复杂一些,用的地方也相当的多,可以统计函数执行效率或node节点执行效率。 觉得有用记得点赞。