2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
11 local find = string.find;
12 local ipairs, pairs, setmetatable = ipairs, pairs, setmetatable;
16 local level_sinks = {};
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");
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, ...);
41 function make_logger(source_name, level)
42 local level_handlers = level_sinks[level];
43 if not level_handlers then
45 level_sinks[level] = level_handlers;
48 local logger = function (message, ...)
49 for i = 1,#level_handlers do
50 level_handlers[i](source_name, level, message, ...);
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;
66 function add_level_sink(level, sink_function)
67 if not level_sinks[level] then
68 level_sinks[level] = { sink_function };
70 level_sinks[level][#level_sinks[level] + 1 ] = sink_function;