3732
|
1 local pack = require "util.table".pack; |
|
2 local json = require "util.json"; |
|
3 local array = require "util.array"; |
|
4 local datetime = require "util.datetime".datetime; |
3746
|
5 local socket = require "socket"; |
3732
|
6 |
|
7 module:set_global(); |
|
8 |
|
9 local function sink_maker(config) |
3746
|
10 local send = function () end |
|
11 if config.filename then |
|
12 local logfile = io.open(config.filename, "a+"); |
|
13 logfile:setvbuf("no"); |
|
14 function send(payload) |
|
15 logfile:write(payload, "\n"); |
|
16 end |
|
17 elseif config.udp_host and config.udp_port then |
|
18 local conn = socket.udp(); |
|
19 conn:connect(config.udphost, config.udpport); |
|
20 function send(payload) |
|
21 conn:send(payload); |
|
22 end |
|
23 end |
3732
|
24 return function (source, level, message, ...) |
|
25 local args = pack(...); |
|
26 for i = 1, args.n do |
|
27 if args[i] == nil then |
|
28 args[i] = json.null; |
|
29 elseif type(args[i]) ~= "string" or type(args[i]) ~= "number" then |
|
30 args[i] = tostring(args[i]); |
|
31 end |
|
32 end |
|
33 args.n = nil; |
|
34 local payload = { |
|
35 datetime = datetime(), |
|
36 source = source, |
|
37 level = level, |
|
38 message = message, |
|
39 args = array(args); |
|
40 }; |
3746
|
41 send(json.encode(payload)); |
3732
|
42 end |
|
43 end |
|
44 |
|
45 require"core.loggingmanager".register_sink_type("json", sink_maker); |