Thu, 03 Dec 2020 17:05:27 +0000
Initial commit
0 | 1 | -- Prosody IM |
2 | -- Copyright (C) 2008-2010 Matthew Wild | |
3 | -- Copyright (C) 2008-2010 Waqas Hussain | |
4 | -- | |
5 | -- This project is MIT/X11 licensed. Please see the | |
6 | -- COPYING file in the source package for more information. | |
7 | -- | |
8 | -- luacheck: ignore 213/level | |
9 | ||
10 | local pairs = pairs; | |
11 | local ipairs = ipairs; | |
12 | local require = require; | |
13 | ||
14 | local _ENV = nil; | |
15 | -- luacheck: std none | |
16 | ||
17 | local level_sinks = {}; | |
18 | ||
19 | local make_logger; | |
20 | ||
21 | local function init(name) | |
22 | local log_debug = make_logger(name, "debug"); | |
23 | local log_info = make_logger(name, "info"); | |
24 | local log_warn = make_logger(name, "warn"); | |
25 | local log_error = make_logger(name, "error"); | |
26 | ||
27 | return function (level, message, ...) | |
28 | if level == "debug" then | |
29 | return log_debug(message, ...); | |
30 | elseif level == "info" then | |
31 | return log_info(message, ...); | |
32 | elseif level == "warn" then | |
33 | return log_warn(message, ...); | |
34 | elseif level == "error" then | |
35 | return log_error(message, ...); | |
36 | end | |
37 | end | |
38 | end | |
39 | ||
40 | function make_logger(source_name, level) | |
41 | local level_handlers = level_sinks[level]; | |
42 | if not level_handlers then | |
43 | level_handlers = {}; | |
44 | level_sinks[level] = level_handlers; | |
45 | end | |
46 | ||
47 | local logger = function (message, ...) | |
48 | for i = 1,#level_handlers do | |
49 | level_handlers[i](source_name, level, message, ...); | |
50 | end | |
51 | end | |
52 | ||
53 | return logger; | |
54 | end | |
55 | ||
56 | local function reset() | |
57 | for level, handler_list in pairs(level_sinks) do | |
58 | -- Clear all handlers for this level | |
59 | for i = 1, #handler_list do | |
60 | handler_list[i] = nil; | |
61 | end | |
62 | end | |
63 | end | |
64 | ||
65 | local function add_level_sink(level, sink_function) | |
66 | if not level_sinks[level] then | |
67 | level_sinks[level] = { sink_function }; | |
68 | else | |
69 | level_sinks[level][#level_sinks[level] + 1 ] = sink_function; | |
70 | end | |
71 | end | |
72 | ||
73 | local function add_simple_sink(simple_sink_function, levels) | |
74 | local format = require "util.format".format; | |
75 | local function sink_function(name, level, msg, ...) | |
76 | return simple_sink_function(name, level, format(msg, ...)); | |
77 | end | |
78 | for _, level in ipairs(levels or {"debug", "info", "warn", "error"}) do | |
79 | add_level_sink(level, sink_function); | |
80 | end | |
81 | end | |
82 | ||
83 | return { | |
84 | init = init; | |
85 | make_logger = make_logger; | |
86 | reset = reset; | |
87 | add_level_sink = add_level_sink; | |
88 | add_simple_sink = add_simple_sink; | |
89 | new = make_logger; | |
90 | }; |