Merge 0.10->trunk
[prosody.git] / util / logger.lua
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
12 local _ENV = nil;
13
14 local level_sinks = {};
15
16 local make_logger;
17
18 local function init(name)
19         local log_debug = make_logger(name, "debug");
20         local log_info = make_logger(name, "info");
21         local log_warn = make_logger(name, "warn");
22         local log_error = make_logger(name, "error");
23
24         return function (level, message, ...)
25                         if level == "debug" then
26                                 return log_debug(message, ...);
27                         elseif level == "info" then
28                                 return log_info(message, ...);
29                         elseif level == "warn" then
30                                 return log_warn(message, ...);
31                         elseif level == "error" then
32                                 return log_error(message, ...);
33                         end
34                 end
35 end
36
37 function make_logger(source_name, level)
38         local level_handlers = level_sinks[level];
39         if not level_handlers then
40                 level_handlers = {};
41                 level_sinks[level] = level_handlers;
42         end
43
44         local logger = function (message, ...)
45                 for i = 1,#level_handlers do
46                         level_handlers[i](source_name, level, message, ...);
47                 end
48         end
49
50         return logger;
51 end
52
53 local function reset()
54         for level, handler_list in pairs(level_sinks) do
55                 -- Clear all handlers for this level
56                 for i = 1, #handler_list do
57                         handler_list[i] = nil;
58                 end
59         end
60 end
61
62 local function add_level_sink(level, sink_function)
63         if not level_sinks[level] then
64                 level_sinks[level] = { sink_function };
65         else
66                 level_sinks[level][#level_sinks[level] + 1 ] = sink_function;
67         end
68 end
69
70 return {
71         init = init;
72         make_logger = make_logger;
73         reset = reset;
74         add_level_sink = add_level_sink;
75         new = make_logger;
76 };