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