darraghd493

Logger

Jan 2nd, 2025 (edited)
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.14 KB | Source Code | 0 0
  1. --[[
  2.     logger by darraghd493
  3.  
  4.     A logger that logs messages with a custom format and placeholders.
  5.     This is useful for logging messages to the console with a custom format.
  6.  
  7.     Core placeholders:
  8.     %name%: The name of the logger
  9.     %level%: The level of the logger
  10.     %message%: The message to log
  11.     %time%: The current time in HH:MM:SS format
  12. ]]
  13.  
  14. local Logger = {
  15.     name = "Logger";
  16.     format = "[%level%] [%name%] %time%: %message%";
  17.     placeholders = { -- Custom placeholders, optional
  18.         time = function()
  19.             return os.date("%H:%M:%S")
  20.         end;
  21.     },
  22.     levels = {
  23.         DEBUG = 0;
  24.         INFO = 1;
  25.         WARN = 2;
  26.         ERROR = 3;
  27.     };
  28.     minimum = 1;
  29.  
  30.     -- Internal properties
  31.     history = {};
  32. }
  33. Logger.__index = Logger
  34.  
  35. local function fetchLevel(level: number)
  36.     for name, value in pairs(Logger.levels) do
  37.         if value == level then
  38.             return name
  39.         end
  40.     end
  41.     return "UNKNOWN"
  42. end
  43.  
  44. function Logger.new(name: string, format: string, placeholders: table, minimum: number)
  45.     local self = setmetatable({
  46.         name = name;
  47.         format = format;
  48.         minimum = minimum or Logger.levels.INFO;
  49.         history = {};
  50.     }, Logger)
  51.     if placeholders ~= nil then
  52.         for placeholder, value in pairs(placeholders) do
  53.             self.placeholders[placeholder] = value
  54.         end
  55.     end
  56.     return self
  57. end
  58.  
  59. function Logger:log(message: string, level: number)
  60.     level = level or self.levels.INFO
  61.  
  62.     local formatted = self.format
  63.     for placeholder, value in pairs(self.placeholders) do
  64.         formatted = formatted:gsub("%%" .. placeholder .. "%%", value)
  65.     end
  66.     formatted = formatted:gsub("%%level%%", fetchLevel(level))
  67.     formatted = formatted:gsub("%%name%%", self.name)
  68.     formatted = formatted:gsub("%%message%%", message)
  69.  
  70.     if level < self.minimum then
  71.         return
  72.     end
  73.  
  74.     if level == self.levels.DEBUG or level == self.levels.INFO then
  75.         print(formatted)
  76.     elseif level == self.levels.WARN then
  77.         warn(formatted)
  78.     elseif level == self.levels.ERROR then
  79.         error(formatted)
  80.     end
  81.  
  82.     self:push(formatted)
  83. end
  84.  
  85. function Logger:debug(message: string)
  86.     self:log(message, self.levels.DEBUG)
  87. end
  88.  
  89. function Logger:info(message: string)
  90.     self:log(message, self.levels.INFO)
  91. end
  92.  
  93. function Logger:warn(message: string)
  94.     self:log(message, self.levels.WARN)
  95. end
  96.  
  97. function Logger:error(message: string)
  98.     self:log(message, self.levels.ERROR)
  99. end
  100.  
  101. function Logger:push(message: string, level)
  102.     table.insert(self.history, {
  103.         message = message;
  104.         level = level or self.levels.INFO;
  105.     })
  106. end
  107.  
  108. function Logger:get(index: number)
  109.     return self.history[index]
  110. end
  111.  
  112. function Logger:remove(index: number)
  113.     table.remove(self.history, index)
  114. end
  115.  
  116. function Logger:clear()
  117.     self.history = {}
  118. end
  119.  
  120. function Logger:__tostring() -- Internal method
  121.     local str = self.name .. " logger history (formatted):\n"
  122.     for i, v in ipairs(self.history) do
  123.         str = str .. v.message .. "\n"
  124.     end
  125.     return str
  126. end
  127.  
  128. return Logger
Advertisement
Add Comment
Please, Sign In to add comment