91 lines
2.6 KiB
Lua
91 lines
2.6 KiB
Lua
|
-- Created by Jef Roosens
|
||
|
--
|
||
|
-- Module to add logging to a program. This module is integrated in all jlib
|
||
|
-- functions.
|
||
|
|
||
|
|
||
|
local module = {}
|
||
|
|
||
|
|
||
|
-- Define class with default values
|
||
|
local Logger = {
|
||
|
level = 2,
|
||
|
level_colors = {
|
||
|
colors.red, colors.orange, colors.yellow, colors.blue, colors.white},
|
||
|
prefixes = { "CRIT", "ERROR", "WARN", "INFO", "DEBUG" },
|
||
|
filename = nil
|
||
|
}
|
||
|
Logger.__index = Logger
|
||
|
|
||
|
|
||
|
-- Return a new logger 'object'.
|
||
|
--
|
||
|
-- @param level log level:
|
||
|
-- (0) critical, (1) errors, (2) warnings, (3) info,(4) debug
|
||
|
-- @param level_colors table containing color names for messages; order is
|
||
|
-- { critical, errors, warnings, info, debug }. Only colors for the needed log
|
||
|
-- level need to be provided: e.g. if the log level is (2) warnings, then only
|
||
|
-- two colors need to be provided. If not provided, defaults to
|
||
|
-- { red, orange, yellow, blue, white }.
|
||
|
-- @param prefixes prefix to show for each log level
|
||
|
-- @param filename log file to write to. If not supplied, log will only be
|
||
|
-- outputted to stdout
|
||
|
-- @return a logger 'object'
|
||
|
function Logger:new(o)
|
||
|
o = o or {}
|
||
|
setmetatable(o, self)
|
||
|
-- Fill in default values where needed
|
||
|
-- TODO find out if this is needed or not
|
||
|
-- for k, v in pairs(Logger) do
|
||
|
-- o[k] = o[k] or Logger[k]
|
||
|
-- end
|
||
|
|
||
|
-- Open file handler
|
||
|
if o.filename then
|
||
|
o._file = open(filename, "a")
|
||
|
end
|
||
|
|
||
|
return o
|
||
|
end
|
||
|
|
||
|
-- Log a message with the given level
|
||
|
--
|
||
|
-- @param level log level; levels higher than logger level get discarded
|
||
|
-- @param message message to log
|
||
|
-- @return wether or not the message was actually logged
|
||
|
function Logger:log(level, message)
|
||
|
-- Exit if the level is too high
|
||
|
if level > self.level then return false end
|
||
|
|
||
|
-- Log to screen
|
||
|
local cur_color = term.getTextColor()
|
||
|
term.setTextColor(self.colors[level + 1])
|
||
|
term.write("[" .. self.prefixes[level + 1] .. "] ")
|
||
|
term.setTextColor(cur_color)
|
||
|
print(message)
|
||
|
|
||
|
-- Log to file
|
||
|
if self._file then
|
||
|
local line = "[" .. self.prefixes[level + 1] .. "] " .. message .. '\n'
|
||
|
self._file.write(line)
|
||
|
self._file.flush()
|
||
|
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- Just some convenience functions; wrappers around Logger:log
|
||
|
function Logger:critical(message) self.log(0, message) end
|
||
|
function Logger:error(message) self.log(1, message) end
|
||
|
function Logger:warning(message) self.log(2, message) end
|
||
|
function Logger:info(message) self.log(3, message) end
|
||
|
function Logger:debug(message) self.log(4, message) end
|
||
|
|
||
|
-- Close the logger a.k.a. close the log file handler
|
||
|
function Logger:close()
|
||
|
if self._file then self._file.close() end
|
||
|
end
|
||
|
|
||
|
|
||
|
module.Logger = Logger
|
||
|
return module
|