-- 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"}, -- Explicit is better than implicit filename = nil } -- 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) self.__index = self -- Open file handler if o.filename then o._file = fs.open(o.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.level_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