vpp---- log模块

2023-03-07 17:11:37 浏览数 (2)

对vpp自带的log模块了解很少,但是功能开发总是因为log的缺失导致问题很多定位。所以有必要了解一下log模块的记录。

  • unix 字段下log:
代码语言:javascript复制
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 字段
代码语言:javascript复制
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模块使用事例 下面是每个消息对应的宏定义
代码语言:javascript复制
#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节点执行效率。 觉得有用记得点赞。

0 人点赞