lua-ln/src/ln.lua

109 lines
1.8 KiB
Lua

local json = require "dkjson"
local function time()
return os.date "%Y-%m-%dT%H:%M:%S"
end
local function quote(value)
if string.find(value, " ") then
return string.format("%q", value)
end
return value
end
local LogfmtFormatter = {}
function LogfmtFormatter:format(tbl)
local message = "time=\"" .. time() .. "\" "
for k, v in pairs(tbl) do
message = message .. k .. "=" .. quote(v) .. " "
end
return message
end
function LogfmtFormatter:new()
local o = {}
setmetatable(o, self)
self.__index = self
return o
end
local JSONFormatter = {}
function JSONFormatter:format(tbl)
tbl["time"] = time()
return json.encode(tbl)
end
function JSONFormatter:new()
local o = {}
setmetatable(o, self)
self.__index = self
return o
end
local Logger = {}
function Logger:err(err, ...)
self:log({err = err}, ...)
end
function Logger:log(...)
local result = {}
local args = table.pack(...)
for i=1, args.n do
if type(args[i]) == "table" then
for k, v in pairs(args[i]) do
result[tostring(k)] = tostring(v)
end
end
end
local message = self.formatter:format(result)
for _, v in pairs(self.filters) do
if v(message) ~= nil then
return
end
end
end
function Logger:new(o)
if o == nil then
o = {}
end
if o.formatter == nil then
o.formatter = LogfmtFormatter:new()
end
if o.filters == nil then
o.filters = {print}
end
setmetatable(o, self)
self.__index = self
return o
end
local default_logger = Logger:new()
local function log(...)
default_logger:log(...)
end
local function err(why, ...)
default_logger:err(why, ...)
end
return {
default_logger = default_logger,
Logger = Logger,
LogfmtFormatter = LogfmtFormatter,
JSONFormatter = JSONFormatter,
log = log,
err = err,
}