107 lines
2.5 KiB
Lua
107 lines
2.5 KiB
Lua
local lsyslog = require "lsyslog"
|
|
local cjson = require "cjson"
|
|
local sandbox = require "kong.tools.sandbox".sandbox
|
|
local kong_meta = require "kong.meta"
|
|
|
|
|
|
local kong = kong
|
|
local ngx = ngx
|
|
local timer_at = ngx.timer.at
|
|
|
|
|
|
local SENDER_NAME = "kong"
|
|
|
|
local LOG_PRIORITIES = {
|
|
debug = 7,
|
|
info = 6,
|
|
notice = 5,
|
|
warning = 4,
|
|
err = 3,
|
|
crit = 2,
|
|
alert = 1,
|
|
emerg = 0
|
|
}
|
|
|
|
local LOG_LEVELS = {
|
|
debug = lsyslog.LOG_DEBUG,
|
|
info = lsyslog.LOG_INFO,
|
|
notice = lsyslog.LOG_NOTICE,
|
|
warning = lsyslog.LOG_WARNING,
|
|
err = lsyslog.LOG_ERR,
|
|
crit = lsyslog.LOG_CRIT,
|
|
alert = lsyslog.LOG_ALERT,
|
|
emerg = lsyslog.LOG_EMERG,
|
|
}
|
|
|
|
local FACILITIES = {
|
|
auth = lsyslog.FACILITY_AUTH,
|
|
authpriv = lsyslog.FACILITY_AUTHPRIV,
|
|
cron = lsyslog.FACILITY_CRON,
|
|
daemon = lsyslog.FACILITY_DAEMON,
|
|
ftp = lsyslog.FACILITY_FTP,
|
|
kern = lsyslog.FACILITY_KERN,
|
|
lpr = lsyslog.FACILITY_LPR,
|
|
mail = lsyslog.FACILITY_MAIL,
|
|
news = lsyslog.FACILITY_NEWS,
|
|
syslog = lsyslog.FACILITY_SYSLOG,
|
|
user = lsyslog.FACILITY_USER,
|
|
uucp = lsyslog.FACILITY_UUCP,
|
|
local0 = lsyslog.FACILITY_LOCAL0,
|
|
local1 = lsyslog.FACILITY_LOCAL1,
|
|
local2 = lsyslog.FACILITY_LOCAL2,
|
|
local3 = lsyslog.FACILITY_LOCAL3,
|
|
local4 = lsyslog.FACILITY_LOCAL4,
|
|
local5 = lsyslog.FACILITY_LOCAL5,
|
|
local6 = lsyslog.FACILITY_LOCAL6,
|
|
local7 = lsyslog.FACILITY_LOCAL7
|
|
}
|
|
|
|
local function send_to_syslog(log_level, severity, message, facility)
|
|
if LOG_PRIORITIES[severity] <= LOG_PRIORITIES[log_level] then
|
|
lsyslog.open(SENDER_NAME, FACILITIES[facility])
|
|
lsyslog.log(LOG_LEVELS[severity], cjson.encode(message))
|
|
end
|
|
end
|
|
|
|
|
|
local function log(premature, conf, message)
|
|
if premature then
|
|
return
|
|
end
|
|
|
|
if message.response.status >= 500 then
|
|
send_to_syslog(conf.log_level, conf.server_errors_severity, message, conf.facility)
|
|
|
|
elseif message.response.status >= 400 then
|
|
send_to_syslog(conf.log_level, conf.client_errors_severity, message, conf.facility)
|
|
|
|
else
|
|
send_to_syslog(conf.log_level, conf.successful_severity, message, conf.facility)
|
|
end
|
|
end
|
|
|
|
|
|
local SysLogHandler = {
|
|
PRIORITY = 4,
|
|
VERSION = kong_meta.version,
|
|
}
|
|
|
|
|
|
function SysLogHandler:log(conf)
|
|
if conf.custom_fields_by_lua then
|
|
local set_serialize_value = kong.log.set_serialize_value
|
|
for key, expression in pairs(conf.custom_fields_by_lua) do
|
|
set_serialize_value(key, sandbox(expression)())
|
|
end
|
|
end
|
|
|
|
local message = kong.log.serialize()
|
|
local ok, err = timer_at(0, log, conf, message)
|
|
if not ok then
|
|
kong.log.err("failed to create timer: ", err)
|
|
end
|
|
end
|
|
|
|
|
|
return SysLogHandler
|