+ 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 logger = function (message, ...)
+ for i = 1,#level_handlers do
+ level_handlers[i](source_name, level, message, ...);
+ end
+ end
+
+ return logger;
+end
+
+function reset()
+ for level, handler_list in pairs(level_sinks) do
+ -- Clear all handlers for this level
+ for i = 1, #handler_list do
+ handler_list[i] = nil;
+ end
+ end
+end
+
+function add_level_sink(level, sink_function)
+ if not level_sinks[level] then
+ level_sinks[level] = { sink_function };
+ else
+ level_sinks[level][#level_sinks[level] + 1 ] = sink_function;
+ end