File: syslog.lua

package info (click to toggle)
lua-sandbox-extensions 0~git20161128-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 2,596 kB
  • ctags: 1,458
  • sloc: ansic: 4,402; cpp: 2,102; makefile: 8
file content (138 lines) | stat: -rw-r--r-- 7,826 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
-- This Source Code Form is subject to the terms of the Mozilla Public
-- License, v. 2.0. If a copy of the MPL was not distributed with this
-- file, You can obtain one at http://mozilla.org/MPL/2.0/.

local syslog = require "lpeg.syslog"

local function traditional_file_format()
    local grammar = syslog.build_rsyslog_grammar('%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n')
    local log = 'Feb  9 14:17:01 trink-x230 CRON[20758]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)\n'
    local fields = grammar:match(log)
    assert(fields.msg == "(root) CMD (   cd / && run-parts --report /etc/cron.hourly)", fields.msg)
    local ts = os.time{year = os.date("%Y"), month = 2, day = 9, hour = 14, min = 17, sec = 01} * 1e9
    assert(fields.timestamp == ts, fields.timestamp)
    assert(fields.syslogtag.pid == 20758, fields.syslogtag.pid)
    assert(fields.syslogtag.programname == "CRON", fields.syslogtag.programname)
    assert(fields.hostname == "trink-x230", fields.hostname)
end

local function file_format()
    local grammar = syslog.build_rsyslog_grammar('%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n')
    local log = '2014-02-10T08:21:59.111537-08:00 trink-x230 kernel: Kernel logging (proc) stopped.\n'
    local fields = grammar:match(log)
    assert(fields.msg == "Kernel logging (proc) stopped.", fields.msg)
    assert(fields.timestamp == 1392049319111537000, fields.timestamp)
    assert(fields.syslogtag.programname == "kernel", fields.syslogtag.programname)
    assert(fields.hostname == "trink-x230", fields.hostname)
end

local function forward_format()
    local grammar = syslog.build_rsyslog_grammar('<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%')
    local log = '<6>2014-02-10T08:33:15.407935-08:00 trink-x230 kernel: imklog 5.8.6, log source = /proc/kmsg started.'
    local fields = grammar:match(log)
    assert(fields.msg == "imklog 5.8.6, log source = /proc/kmsg started.", fields.msg)
    assert(fields.timestamp == 1392049995407935000, fields.timestamp)
    assert(fields.syslogtag.programname == "kernel", fields.syslogtag.programname)
    assert(fields.pri.severity == 6, fields.pri.severity)
    assert(fields.pri.facility == 0, fields.pri.facility)
    assert(fields.hostname == "trink-x230", fields.hostname)
end

local function traditional_forward_format()
    local grammar = syslog.build_rsyslog_grammar('<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%')
    local log = '<6>Feb 10 08:38:47 trink-x230 kernel: imklog 5.8.6, log source = /proc/kmsg started.'
    local fields = grammar:match(log)
    assert(fields.msg == "imklog 5.8.6, log source = /proc/kmsg started.", fields.msg)
    local ts = os.time{year = os.date("%Y"), month = 2, day = 10, hour = 8, min = 38, sec = 47} * 1e9
    assert(fields.timestamp == ts, fields.timestamp)
    assert(fields.syslogtag.programname == "kernel", fields.syslogtag.programname)
    assert(fields.pri.severity == 6, fields.pri.severity)
    assert(fields.pri.facility == 0, fields.pri.facility)
    assert(fields.hostname == "trink-x230", fields.hostname)
end

local function kitchen_sink()
    local grammar = syslog.build_rsyslog_grammar("%HOSTNAME% %SOURCE% %FROMHOST% %FROMHOST-IP% %SYSLOGTAG% %PROGRAMNAME% %PRI% %PRI-TEXT% %IUT% %SYSLOGFACILITY% %SYSLOGFACILITY-TEXT% %SYSLOGPRIORITY% %SYSLOGPRIORITY-TEXT% %TIMEGENERATED% %TIMEREPORTED:::date-mysql% %TIMESTAMP:::date-rfc3339% %PROTOCOL-VERSION% %STRUCTURED-DATA% %APP-NAME% %PROCID% %MSGID% %$NOW% %$YEAR% %$MONTH% %$DAY% %$HOUR% %$HHOUR% %$QHOUR% %$MINUTE% %MSG%\n")
    local log = 'trink-x230 trink-x230 trink-x230 127.0.0.1 kernel: kernel 6 kern.info<6> 1 0 kern 6 info Feb 10 09:20:53 20140210092053 2014-02-10T09:20:53.559934-08:00 0 - kernel  - 2014-02-10 2014 02 10 09 00 01 20 imklog 5.8.6, log source = /proc/kmsg started.\n'
    local fields = grammar:match(log)
    assert(fields.hostname == "trink-x230", fields.hostname)
    assert(fields.source == "trink-x230", fields.source)
    assert(fields.fromhost == "trink-x230", fields.fromhost)
    assert(fields["fromhost-ip"] == "127.0.0.1", fields["fromhost-ip"])
    assert(fields.syslogtag.programname == "kernel", fields.syslogtag.programname)
    assert(fields.programname == "kernel", fields.programname)
    assert(fields.pri.severity == 6, fields.pri.severity)
    assert(fields.pri.facility == 0, fields.pri.facility)
    assert(fields["pri-text"] == 0, fields["pri-text"])
    assert(fields.iut == "1", fields.iut)
    assert(fields.syslogfacility == 0, fields.syslogfacility)
    assert(fields["syslogfacility-text"] == 0, fields["syslogfacility-text"])
    assert(fields.syslogpriority == 6, fields.syslogpriority)
    assert(fields["syslogpriority-text"] == 6, fields["syslogpriority-text"])
    local ts = os.time{year = os.date("%Y"), month = 2, day = 10, hour = 9, min = 20, sec = 53} * 1e9
    assert(fields.timegenerated == ts, fields.timegenerated)
    -- time reported is mapped to timestamp
    assert(fields.timestamp == 1392052853559934000, fields.timestamp)
    assert(fields["protocol-version"] == "0", fields["protocol-version"])
    assert(type(fields["structured-data"]) == "table", type(fields["structured-data"]))
    assert(fields["app-name"] == "kernel", fields["app-name"])
    assert(fields.procid == "", fields.procid)
    assert(fields.msgid == "-", fields.msgid)
    assert(fields["$now"] == "2014-02-10", fields["$now"])
    assert(fields["$year"] == "2014")
    assert(fields["$month"] == "02")
    assert(fields["$day"] == "10")
    assert(fields["$hour"] == "09")
    assert(fields["$hhour"] == "00")
    assert(fields["$qhour"] == "01")
    assert(fields["$minute"] == "20")
    assert(fields.msg == "imklog 5.8.6, log source = /proc/kmsg started.", fields.msg)
end

local function no_colon_in_tag()
    local grammar = syslog.build_rsyslog_grammar('<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%')
    local log = '<166>2014-06-26T23:13:23-07:00 example.com     at java.net.SocketInputStream.socketRead0(Native Method)'
    local fields = grammar:match(log)
    assert(fields.msg == "at java.net.SocketInputStream.socketRead0(Native Method)", fields.msg)
    assert(fields.timestamp == 1403849603000000000, fields.timestamp)
    assert(fields.syslogtag.programname == "", fields.syslogtag.programname)
    assert(fields.pri.severity == 6, fields.pri.severity)
    assert(fields.pri.facility == 20, fields.pri.facility)
    assert(fields.hostname == "example.com", fields.hostname)
end

local function structured_data()
    local grammar = syslog.build_rsyslog_grammar("%STRUCTURED-DATA%")
    local log = '[origin@123 name1="first value" name2="sec\\ond\\\\v[a\\]l\\"ue"]'
    local fields = grammar:match(log)
    local sd = fields["structured-data"]
    assert(sd["_name1"] == "first value", sd["_name1"])
    assert(sd["_name2"] == "sec\\ond\\v[a]l\"ue", sd["_name2"])
    assert(sd["id"] == "origin@123", sd["id"])

    log = '[origin@123 name="value\\\\"]'
    fields = grammar:match(log)
    sd = fields["structured-data"]
    assert(sd["_name"] == "value\\", sd["_name"])
    assert(sd["id"] == "origin@123", sd["id"])

    log = '[origin@123 name="value\\\""]'
    fields = grammar:match(log)
    sd = fields["structured-data"]
    assert(sd["_name"] == 'value"', sd["_name"])
    assert(sd["id"] == "origin@123", sd["id"])

    log = '[origin@123 name=""]'
    fields = grammar:match(log)
    sd = fields["structured-data"]
    assert(sd["_name"] == "", sd["_name"])
    assert(sd["id"] == "origin@123", sd["id"])
end

traditional_file_format()
file_format()
forward_format()
traditional_forward_format()
kitchen_sink()
no_colon_in_tag()
structured_data()