系统日志遭受php中的packetloss

在我们的php应用程序中,我们使用syslog调用进行日志logging,但是我们注意到系统中存在packetloss。

我们使用以下设置:Ubuntu 14.04,PHP 7.0,系统日志3.5.6。 Php根据设施和优先级将日志传输到本地系统日志服务器(通过/ dev / log),将日志传输到中央日志logging服务器。

由于心跳cron,我们监视系统中的包丢失,并且经常发现包丢失。 Strace显示数据包在php和syslog之间丢失

正常的日志调用就像这样

socket(PF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 3 connect(3, {sa_family=AF_LOCAL, sun_path="/dev/log"}, 110) = -1 EPROTOTYPE (Protocol wrong type for socket) close(3) = 0 socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 3 connect(3, {sa_family=AF_LOCAL, sun_path="/dev/log"}, 110) = 0 sendto(3, "<154>Oct 31 06:12:02 Framework_L"..., 125, MSG_NOSIGNAL, NULL, 0) = 125 close(3) = 0 

正如你所看到的,这个调用首先试图打开/ dev / log作为一个数据报套接字,因为我们使用了一个数据报套接字。 下一个连接是作为一个SOCK_STREAM,这个工作,并发送日志。

失败的调用如下所示:

 socket(PF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 3 connect(3, {sa_family=AF_LOCAL, sun_path="/dev/log"}, 110) = -1 EPROTOTYPE (Protocol wrong type for socket) close(3) = 0 socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 3 connect(3, {sa_family=AF_LOCAL, sun_path="/dev/log"}, 110) = 0 sendto(3, "<157>Oct 31 06:12:02 Framework_L"..., 125, MSG_NOSIGNAL, NULL, 0) = -1 EPIPE (Broken pipe) close(3) = 0 socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 3 connect(3, {sa_family=AF_LOCAL, sun_path="/dev/log"}, 110) = 0 sendto(3, "<157>Oct 31 06:12:02 Framework_L"..., 125, MSG_NOSIGNAL, NULL, 0) = -1 EPIPE (Broken pipe) close(3) = 0 

在这里,我们看到stream部分被两次尝试,由于pipe道破损,两次都失败。 通话停在那里,不会重试。

在这些问题中,Syslog没有其他迹象表明无法应付负载。 所有syslog计数器显示没有丢弃的数据包等。

我们似乎无法在实验室环境中重build问题,但这种情况经常发生在野外。

我们遇到的问题是: – 这里发生了什么?

  • 您将在解决此问题的下一步是什么?

  • 为什么syslog()调用总是返回true,而我们正在使用Sock_stream,并且它接收到一个“断开的pipe道”(根据文档syslog()应该在日志成功时返回true)