VPP 提供RFC5424 syslog 协议日志记录,用于跨网络传输事件消息。VPP 目前已支持基于 RFC5426的 UDP 传输。
系统日志消息具有以下格式:* header * structured data * free-form message。
标头包含优先级、版本、时间戳、主机名、应用程序、进程 ID 和消息 ID。紧随其后的是结构化数据,它提供了一种以易于解析的格式表达事件数据的机制。结构化数据可以包含零个、一个或多个结构化数据元素。结构化数据元素包含名称-值对。结构化数据后面可以跟指定长度消息内容。下面是抓取vpp发送到syslog服务器的报文内容抓包显示如下:
接下来说明一下验证过程。
第一步:搭建syslog服务器
1、ubuntu系统安装rsyslog服务器
sudo apt-get install rsyslog
2、修改/etc/rsyslog.conf配置文件,将udp端口绑定的行放开注释
#provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")
3、创建用于接收远程消息的新模板 让我们创建一个模板,指示rsyslog服务器如何存储传入的syslog消息,在GLOBAL DIRECTIVES部分之前添加模板:
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& stop
收到的日志将使用上面的模板进行解析并存储在目录/var/log/remote中,文件命名遵循约定:%HOSTNAME% and %PROGRAMNAME%变量,即:客户端主机名和生成日志消息的客户端工具。 & stop指示rsyslog守护程序仅将日志消息存储到指定的文件(也有人使用& ~)。 可以使用的其它变量包括: %syslogseverity%, %syslogfacility%, %timegenerated%, %HOSTNAME%, %syslogtag%, %msg%, %FROMHOST-IP%, %PRI%, %MSGID%, %APP-NAME%, %TIMESTAMP%, %y e a r year%, %yearmonth%, %$day%
第二步:配置vpp syslog系统日志接收服务器及设置过滤条件
1、vpp中设置syslog接收服务器并查询
set syslog sender collector 192.168.1.4 src 192.168.1.20
vpp# show syslog sender
collector 192.168.1.4:514, src address 192.168.1.20, VRF ID -1, max-msg-size 480
2、设置syslog日志过滤器,默认是info信息。
vpp# set syslog filter severity debug
vpp# show syslog filter
severity-filter: debug
第三步:使用vpp自带测试命令行来验证。
1、发送syslog消息
vpp# test syslog local0 debug vpp 100 sa-id 10 sd-param jinsh 111 "helloworld"
vpp# test syslog local0 debug vpp 100 sa-id 10 sd-param jinsh 111 "helloworld1122"
2、在服务器上查询消息内容 syslog日志生成路径:/var/log/remote/192.168.1.20/vpp.log
root@jinsh:/var/log/remote/192.168.1.20# cat vpp.log
2023-02-19T07:54:04.536534Z 192.168.1.20 vpp[2355] "helloworld"
2023-02-19T07:54:05.541047Z 192.168.1.20 vpp[2355] message repeated 3 times: ["helloworld"]
2023-02-19T07:56:19.171524Z 192.168.1.20 vpp[2355] sa-id 10 sd-param jinsh 111 "helloworld"
2023-02-19T08:20:25.321593Z 192.168.1.20 vpp[2355] message repeated 6 times: [sa-id 10 sd-param jinsh 111 "helloworld"]
2023-02-19T08:20:29.446796Z 192.168.1.20 vpp[2355] sa-id 10 sd-param jinsh 111 "helloworld1122"
目前syslog模块主要用于nat模块会话信息的存储,后续再进行nat会话信息的验证。下面是syslog在nat模块使用的举例:
#include <vnet/syslog/syslog.h>
...
syslog_msg_t syslog_msg;
/* Check if syslog logging is enabled */
if (!syslog_is_enabled ())
return;
/* Severity filer test */
if (syslog_severity_filter_block (severity))
return;
/* Initialize syslog message header */
syslog_msg_init (&syslog_msg, facility, severity, "NAT", "SADD");
/* Create structured data element */
syslog_msg_sd_init (&syslog_msg, "nsess");
/* Add structured data element parameters (name-value pairs) */
syslog_msg_add_sd_param (&syslog_msg, "SSUBIX", "%d", ssubix);
syslog_msg_add_sd_param (&syslog_msg, "SVLAN", "%d", svlan);
syslog_msg_add_sd_param (&syslog_msg, "IATYP", "IPv4");
syslog_msg_add_sd_param (&syslog_msg, "ISADDR", "%U",
format_ip4_address, isaddr);
syslog_msg_add_sd_param (&syslog_msg, "ISPORT", "%d", isport);
syslog_msg_add_sd_param (&syslog_msg, "XATYP", "IPv4");
syslog_msg_add_sd_param (&syslog_msg, "XSADDR", "%U",
format_ip4_address, xsaddr);
syslog_msg_add_sd_param (&syslog_msg, "XSPORT", "%d", xsport);
syslog_msg_add_sd_param (&syslog_msg, "PROTO", "%d", proto);
/* Send syslog message */
syslog_msg_send (&syslog_msg);
上面的示例生成以下系统日志消息:<134>1 2018-11-12T11:25:30.252715Z 172.16.4.1 NAT 5901 SADD [nsess SSUBIX=“0” SVLAN=“0” IATYP=“IPv4” ISADDR=“172.16.1.2 ” ISPORT=“6303” XATYP=“IPv4” XSADDR=“10.0.0.3” XSPORT=“16253” PROTO=“6”]
参考资料:
1、https://blog.csdn.net/chenwr2018/article/details/121742978
2、https://blog.csdn.net/SweetHeartHuaZai/article/details/128330473
本文分享自 DPDK VPP源码分析 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!