- return function (level, message, ...)
- if not name then
- local inf = debug.getinfo(3, 'Snl');
- level = level .. ","..tostring(inf.short_src):match("[^/]*$")..":"..inf.currentline;
- end
- if ... then
- print(level, format(message, ...));
- else
- print(level, message);
+ local namelen = #name;
+ return function (level, message, ...)
+ if outfunction then return outfunction(name, level, message, ...); end
+
+ if level == "debug" then
+ return log_debug(message, ...);
+ elseif level == "info" then
+ return log_info(message, ...);
+ elseif level == "warn" then
+ return log_warn(message, ...);
+ elseif level == "error" then
+ return log_error(message, ...);
+ end
+ end
+end
+
+function make_logger(source_name, level)
+ local level_handlers = level_sinks[level];
+ if not level_handlers then
+ level_handlers = {};
+ level_sinks[level] = level_handlers;
+ end
+
+ local source_handlers = name_sinks[source_name];
+
+ -- All your premature optimisation is belong to me!
+ local num_level_handlers, num_source_handlers = #level_handlers, source_handlers and #source_handlers;
+
+ local logger = function (message, ...)
+ if source_handlers then
+ for i = 1,num_source_handlers do
+ if source_handlers[i](source_name, level, message, ...) == false then
+ return;