Skip to content

Instantly share code, notes, and snippets.

@artman41
Last active November 24, 2020 22:15
Show Gist options
  • Save artman41/87ceaa64d2ade394da2a00fd5449cd63 to your computer and use it in GitHub Desktop.
Save artman41/87ceaa64d2ade394da2a00fd5449cd63 to your computer and use it in GitHub Desktop.
A logging object for Lua

An example of usage is the following

local Logger = require("objects/logger")

logger = Logger:new(Logger.ERROR())

logger:debug("%s %d", "this is a debug", 1)

logger:error("%s %d", "this is an error", 2)

logger:setLogLevel(Logger.DEBUG())

logger:debug("%s %d", "Notice how you couldn't see the other debug?", 1)
local Object = require "objects/object"
local LogLevel = require "loglevel"
local DEBUG = LogLevel:new(1, "DEBUG")
local INFO = LogLevel:new(2, "INFO")
local WARN = LogLevel:new(3, "WARN")
local ERROR = LogLevel:new(4, "ERROR")
local Logger = Object:new{
log_level = nil
}
function Logger.DEBUG()
return DEBUG
end
function Logger.INFO()
return INFO
end
function Logger.WARN()
return WARN
end
function Logger.ERROR()
return ERROR
end
local function __init(obj, logLevel)
if not LogLevel.isInstanceOf(logLevel) then
logLevel = INFO
end
obj.log_level = logLevel
return true
end
function Logger:new(...)
local obj = {}
setmetatable(obj, self)
self.__index = self
self.__type = "Logger"
__init(obj, ...)
return obj
end
function Logger:setLogLevel(logLevel)
self.log_level = logLevel
end
local function __log(self, logLevel, format, ...)
if not LogLevel.isInstanceOf(logLevel) then
return
end
if format == nil then
return
end
if logLevel.value < self.log_level.value then
return
end
local logStr = string.format("[%-5s] " .. format, logLevel:toString(), ...)
print(logStr)
end
function Logger:debug(format, ...)
__log(self, DEBUG, format, ...)
end
function Logger:info(format, ...)
__log(self, INFO, format, ...)
end
function Logger:warn(format, ...)
__log(self, WARN, format, ...)
end
function Logger:error(format, ...)
__log(self, ERROR, format, ...)
end
return Logger
local Object = require "objects/object"
local LogLevel = {
value = nil,
string = nil
}
local function __init(obj, value, str)
obj.value = value
obj.string = str or ""
return true
end
function LogLevel:new(...)
local obj = {}
setmetatable(obj, self)
self.__index = self
self.__type = "LogLevel"
__init(obj, ...)
return obj
end
function LogLevel:toString()
return self.string
end
function LogLevel.isInstanceOf(obj)
return obj ~= nil and obj.__type == "LogLevel"
end
return LogLevel
local Object = {
__type = nil
}
function Object:new()
local obj = {}
setmetatable(obj, self)
self.__index = self
self.__type = type(self)
return obj
end
function Object:equals(other)
return self == other
end
function Object:toString()
return tostring(self)
end
function Object:isInstanceOf(self, other)
if other == nil then
return false
end
return self.__type == other.__type
end
function Object.isInstanceOf(obj, type)
if obj == nil then
return false
end
return obj.__type == type
end
return Object
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment