util.debug: Remove 'white' from boundary style (leave at default colour)
[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         --name = nil; -- While this line is not commented, will automatically fill in file/line number info
27         local namelen = #name;
28         return function (level, message, ...)
29                         if level == "debug" then
30                                 return log_debug(message, ...);
31                         elseif level == "info" then
32                                 return log_info(message, ...);
33                         elseif level == "warn" then
34                                 return log_warn(message, ...);
35                         elseif level == "error" then
36                                 return log_error(message, ...);
37                         end
38                 end
39 end
40
41 function make_logger(source_name, level)
42         local level_handlers = level_sinks[level];
43         if not level_handlers then
44                 level_handlers = {};
45                 level_sinks[level] = level_handlers;
46         end
47
48         local logger = function (message, ...)
49                 for i = 1,#level_handlers do
50                         level_handlers[i](source_name, level, message, ...);
51                 end
52         end
53
54         return logger;
55 end
56
57 function reset()
58         for level, handler_list in pairs(level_sinks) do
59                 -- Clear all handlers for this level
60                 for i = 1, #handler_list do
61                         handler_list[i] = nil;
62                 end
63         end
64 end
65
66 function add_level_sink(level, sink_function)
67         if not level_sinks[level] then
68                 level_sinks[level] = { sink_function };
69         else
70                 level_sinks[level][#level_sinks[level] + 1 ] = sink_function;
71         end
72 end
73
74 _M.new = make_logger;
75
76 return _M;