You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.9 KiB
Lua
149 lines
3.9 KiB
Lua
local string = require "string"
|
|
local math = require "math"
|
|
local Log = require "log"
|
|
|
|
local mod, floor, ceil, abs, pow = math.fmod, math.floor, math.ceil, math.abs, math.pow
|
|
local fmt = string.format
|
|
|
|
-- removes the decimal part of a number
|
|
local function fix(n)
|
|
n = tonumber(n)
|
|
return n and ((n > 0 and floor or ceil)(n))
|
|
end
|
|
|
|
local function lshift(a, b)
|
|
if math.pow then
|
|
return a * math.pow(2, b)
|
|
else
|
|
return a << b
|
|
end
|
|
end
|
|
|
|
--[[ RFC5424
|
|
0 Emergency: system is unusable
|
|
1 Alert: action must be taken immediately
|
|
2 Critical: critical conditions
|
|
3 Error: error conditions
|
|
4 Warning: warning conditions
|
|
5 Notice: normal but significant condition
|
|
6 Informational: informational messages
|
|
7 Debug: debug-level messages
|
|
--]]
|
|
local SEVERITY = {
|
|
EMERG = 0,
|
|
ALERT = 1,
|
|
CRIT = 2,
|
|
ERR = 3,
|
|
WARNING = 4,
|
|
NOTICE = 5,
|
|
INFO = 6,
|
|
DEBUG = 7,
|
|
}
|
|
|
|
--[[ RFC5424
|
|
0 kernel messages
|
|
1 user-level messages
|
|
2 mail system
|
|
3 system daemons
|
|
4 security/authorization messages
|
|
5 messages generated internally by syslogd
|
|
6 line printer subsystem
|
|
7 network news subsystem
|
|
8 UUCP subsystem
|
|
9 clock daemon
|
|
10 security/authorization messages
|
|
11 FTP daemon
|
|
12 NTP subsystem
|
|
13 log audit
|
|
14 log alert
|
|
15 clock daemon (note 2)
|
|
16 local use 0 (local0)
|
|
17 local use 1 (local1)
|
|
18 local use 2 (local2)
|
|
19 local use 3 (local3)
|
|
20 local use 4 (local4)
|
|
21 local use 5 (local5)
|
|
22 local use 6 (local6)
|
|
23 local use 7 (local7)
|
|
--]]
|
|
local FACILITY = {
|
|
KERN = lshift(0, 3),
|
|
USER = lshift(1, 3),
|
|
MAIL = lshift(2, 3),
|
|
DAEMON = lshift(3, 3),
|
|
AUTH = lshift(4, 3),
|
|
SYSLOG = lshift(5, 3),
|
|
LPR = lshift(6, 3),
|
|
NEWS = lshift(7, 3),
|
|
UUCP = lshift(8, 3),
|
|
CRON = lshift(9, 3),
|
|
CLKD = lshift(9, 3),
|
|
AUTHPRIV = lshift(10, 3),
|
|
FTP = lshift(11, 3),
|
|
NTP = lshift(12, 3),
|
|
SECURITY = lshift(13, 3),
|
|
AUDIT = lshift(13, 3),
|
|
CONSOLE = lshift(14, 3),
|
|
ALERT = lshift(14, 3),
|
|
CLKD2 = lshift(15, 3),
|
|
LOCAL0 = lshift(16, 3),
|
|
LOCAL1 = lshift(17, 3),
|
|
LOCAL2 = lshift(18, 3),
|
|
LOCAL3 = lshift(19, 3),
|
|
LOCAL4 = lshift(20, 3),
|
|
LOCAL5 = lshift(21, 3),
|
|
LOCAL6 = lshift(22, 3),
|
|
LOCAL7 = lshift(23, 3),
|
|
}
|
|
|
|
local LVL2SYSLOG = {
|
|
[Log.LVL.EMERG] = SEVERITY.EMERG,
|
|
[Log.LVL.ALERT] = SEVERITY.ALERT,
|
|
[Log.LVL.FATAL] = SEVERITY.CRIT,
|
|
[Log.LVL.ERROR] = SEVERITY.ERR,
|
|
[Log.LVL.WARNING] = SEVERITY.WARNING,
|
|
[Log.LVL.NOTICE] = SEVERITY.NOTICE,
|
|
[Log.LVL.INFO] = SEVERITY.INFO,
|
|
[Log.LVL.DEBUG] = SEVERITY.DEBUG,
|
|
[Log.LVL.TRACE] = SEVERITY.DEBUG,
|
|
}
|
|
|
|
local function Date2SysLog(now)
|
|
local Y, M, D = now:getdate()
|
|
local h, m, s = now:gettime()
|
|
|
|
local b = -now:getbias();
|
|
local x = abs(b);
|
|
|
|
return fmt("%.4d-%.2d-%.2dT%.2d:%.2d:%.2d%s%.2d:%.2d", Y, M, D, h, m, s, b < 0 and "-" or "+", fix(x / 60),
|
|
floor(mod(x, 60)))
|
|
end
|
|
|
|
local M = {}
|
|
|
|
function M.new(facility, host_name, app_name, procid, msgid)
|
|
if not facility then
|
|
facility = FACILITY.USER
|
|
else
|
|
facility = FACILITY[facility:upper()]
|
|
end
|
|
host_name = host_name or '-'
|
|
app_name = app_name or '-'
|
|
procid = procid or '-'
|
|
msgid = msgid or '-'
|
|
|
|
-- HOSTNAME APP-NAME PROCID MSGID
|
|
local header = host_name .. ' ' .. app_name .. ' ' .. procid .. ' ' .. msgid
|
|
|
|
return function(msg, lvl, now)
|
|
local slvl = assert(LVL2SYSLOG[lvl])
|
|
return -- HEADER
|
|
-- PRI VERSION TIMESTAMP
|
|
'<' .. slvl + facility .. '>1 ' .. Date2SysLog(now) .. ' ' .. -- HEADER STRUCTURED-DATA MSG
|
|
header .. ' - ' .. msg
|
|
|
|
end
|
|
end
|
|
|
|
return M
|