64 lines
1.3 KiB
Lua
64 lines
1.3 KiB
Lua
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 udp = ngx.socket.udp
|
|
|
|
|
|
local function log(premature, conf, str)
|
|
if premature then
|
|
return
|
|
end
|
|
|
|
local sock = udp()
|
|
sock:settimeout(conf.timeout)
|
|
|
|
local ok, err = sock:setpeername(conf.host, conf.port)
|
|
if not ok then
|
|
kong.log.err("could not connect to ", conf.host, ":", conf.port, ": ", err)
|
|
sock:close()
|
|
return
|
|
end
|
|
|
|
ok, err = sock:send(str)
|
|
if not ok then
|
|
kong.log.err("could not send data to ", conf.host, ":", conf.port, ": ", err)
|
|
|
|
else
|
|
kong.log.debug("sent: ", str)
|
|
end
|
|
|
|
ok, err = sock:close()
|
|
if not ok then
|
|
kong.log.err("could not close ", conf.host, ":", conf.port, ": ", err)
|
|
end
|
|
end
|
|
|
|
|
|
local UdpLogHandler = {
|
|
PRIORITY = 8,
|
|
VERSION = kong_meta.version,
|
|
}
|
|
|
|
|
|
function UdpLogHandler: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 ok, err = timer_at(0, log, conf, cjson.encode(kong.log.serialize()))
|
|
if not ok then
|
|
kong.log.err("could not create timer: ", err)
|
|
end
|
|
end
|
|
|
|
|
|
return UdpLogHandler
|