Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- logger by darraghd493
- A logger that logs messages with a custom format and placeholders.
- This is useful for logging messages to the console with a custom format.
- Core placeholders:
- %name%: The name of the logger
- %level%: The level of the logger
- %message%: The message to log
- %time%: The current time in HH:MM:SS format
- ]]
- local Logger = {
- name = "Logger";
- format = "[%level%] [%name%] %time%: %message%";
- placeholders = { -- Custom placeholders, optional
- time = function()
- return os.date("%H:%M:%S")
- end;
- },
- levels = {
- DEBUG = 0;
- INFO = 1;
- WARN = 2;
- ERROR = 3;
- };
- minimum = 1;
- -- Internal properties
- history = {};
- }
- Logger.__index = Logger
- local function fetchLevel(level: number)
- for name, value in pairs(Logger.levels) do
- if value == level then
- return name
- end
- end
- return "UNKNOWN"
- end
- function Logger.new(name: string, format: string, placeholders: table, minimum: number)
- local self = setmetatable({
- name = name;
- format = format;
- minimum = minimum or Logger.levels.INFO;
- history = {};
- }, Logger)
- if placeholders ~= nil then
- for placeholder, value in pairs(placeholders) do
- self.placeholders[placeholder] = value
- end
- end
- return self
- end
- function Logger:log(message: string, level: number)
- level = level or self.levels.INFO
- local formatted = self.format
- for placeholder, value in pairs(self.placeholders) do
- formatted = formatted:gsub("%%" .. placeholder .. "%%", value)
- end
- formatted = formatted:gsub("%%level%%", fetchLevel(level))
- formatted = formatted:gsub("%%name%%", self.name)
- formatted = formatted:gsub("%%message%%", message)
- if level < self.minimum then
- return
- end
- if level == self.levels.DEBUG or level == self.levels.INFO then
- print(formatted)
- elseif level == self.levels.WARN then
- warn(formatted)
- elseif level == self.levels.ERROR then
- error(formatted)
- end
- self:push(formatted)
- end
- function Logger:debug(message: string)
- self:log(message, self.levels.DEBUG)
- end
- function Logger:info(message: string)
- self:log(message, self.levels.INFO)
- end
- function Logger:warn(message: string)
- self:log(message, self.levels.WARN)
- end
- function Logger:error(message: string)
- self:log(message, self.levels.ERROR)
- end
- function Logger:push(message: string, level)
- table.insert(self.history, {
- message = message;
- level = level or self.levels.INFO;
- })
- end
- function Logger:get(index: number)
- return self.history[index]
- end
- function Logger:remove(index: number)
- table.remove(self.history, index)
- end
- function Logger:clear()
- self.history = {}
- end
- function Logger:__tostring() -- Internal method
- local str = self.name .. " logger history (formatted):\n"
- for i, v in ipairs(self.history) do
- str = str .. v.message .. "\n"
- end
- return str
- end
- return Logger
Advertisement
Add Comment
Please, Sign In to add comment