util/logger.lua

changeset 0
550f506de75a
equal deleted inserted replaced
-1:000000000000 0:550f506de75a
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 };

mercurial