- return function (level, message, ...)
- if outfunction then return outfunction(name, level, message, ...); end
-
- sourcewidth = math_max(#name+2, sourcewidth);
- if ... then
- io_write(name, rep(" ", sourcewidth-namelen), getstring(logstyles[level], level), "\t", format(message, ...), "\n");
- else
- io_write(name, rep(" ", sourcewidth-namelen), getstring(logstyles[level], level), "\t", message, "\n");
+ 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;