local pprint = require 'pprint' local class = require 'r.class' local qw = require 'r.qw' local Log = class() function Log.make(cls, name, level) return setmetatable({ name=name, level = level or 'info', },cls) end local levels = qw"debug info warn error" function Log.format(self, level, ...) local vals = {} for i=1,select('#',...) do vals[i] = tostring(select(i,...)) end return (level == 'error' and '\x1b[31m' or '') ..os.date"%Y-%m-%d %H:%M:%S%z" .. ' ' .. level .. (" "):rep(5-#level) .. ' [' .. self.name .. '] ' .. table.concat(vals,' ') .. '\x1b[0m' .. '\n' end function Log.msg(self,level,...) if levels[level] < levels[self.level] then return end io.stderr:write(self:format(level, ...)) io.stderr:flush() end for i,v in ipairs(levels) do levels[v]=i Log[v] = function(self,...) self:msg(v,...) end end Log.__call = Log.info -- handle errors correctly function Log.loop(self, cq) local ok, err, code, thread, pollee, fd = cq:loop() local msg = debug.traceback(thread, err) self:error(err) error('👉'..self.name..' '..msg,0) end return Log