diff options
Diffstat (limited to 'log.lua')
| -rw-r--r-- | log.lua | 46 |
1 files changed, 46 insertions, 0 deletions
@@ -0,0 +1,46 @@ +local pprint = require 'pprint' +local class = require 'r.class' +local qw = require 'r.qw' + +local levels = qw"debug proto info warn error" + +local Log = class() +function Log.make(cls, name, level) + return setmetatable({ + name=name, + level = level or 'info', + },cls) +end +local colours = {debug="\x1b[38;5;8m",error="\x1b[31m"} +function Log.format(self, level, ...) + local vals = {} for i=1,select('#',...) do + local v = (select(i,...)) + vals[i] = type(v) == 'string' and v or pprint.pformat(v) + end + return (colours[level] 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 + |
