检查Ruby中的UDP syslog数据包

时间:2013-08-02 22:39:55

标签: ruby sockets udp syslog

我正试图破解基于Ruby的(1.9.1)系统日志服务器,并且从一开始就遇到了一个非常基本的问题。

这是我的(非常基本的)代码:

#!/usr/bin/env ruby

require 'socket'
require 'io/wait'
require 'syslog'

class Server
    def initialize
        @listener = UDPSocket.new
        @listener.bind("192.168.253.5", "514")
        getdata
    end

    def getdata
        while true
            @text, @sender = @listener.recvfrom(9000)
            p @listener
            p @text
            p @sender
        end
    end
end

x = Server.new

一切正常,但这不会显示设施或消息的严重性:

#<UDPSocket:fd 5>
"<189>49: *Mar  1 00:24:37.862: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/8, changed state to down"
["AF_INET", 56970, "192.168.253.10", "192.168.253.10"]

Tcpdump显示此信息很好(“local7”设施,“通知”严重性):

15:18:01.987542 IP 192.168.253.10.56970 > 192.168.253.5.514: SYSLOG local7.notice, length: 115

如何检查发送给我的UDP数据包,以便我可以收集系统日志消息的设施和严重性?

1 个答案:

答案 0 :(得分:3)

每当您实现明确定义的网络协议时,请始终查看RFC:

http://tools.ietf.org/html/rfc5424

The Priority value is calculated by first multiplying the Facility
   number by 8 and then adding the numerical value of the Severity. 

所以根据RFC,“local7”是23。 23 * 8 = 184

“通知”的严重程度为5:184 + 5 = 189.

在你的消息开头就有189个 - 这是RFC引用的“优先级”数字。

因此,您需要将RFC中的数值和文本描述之间的映射编码到您的程序中并自行计算。

获得切断和设施:

Severity = Priority % 8
Facility = Priority / 8