170 lines
5.4 KiB
Lua

Logging = {}
local append_log=false
local debug_level = 0
local debug_filter = "all"
local global_profiler = nil
local profiler = nil
function Logging:new()
self.limit = 5
self.filename="helmod\\helmod.log"
self.logClass = {}
self.debug_values = {none=0,error=1,warn=2,info=3,debug=4,trace=5}
self:updateLevel()
self.profiler = false
end
function Logging:profilerStart()
if self.profiler == false then return end
if global_profiler == nil then global_profiler = game.create_profiler() end
global_profiler.reset()
log({"", "[PROFILER]", " | ", "GLOBAL", " | ", "*** Profiler begin ***", " | ", global_profiler})
end
function Logging:profilerStep(name, ...)
if self.profiler == false then return end
if profiler == nil then profiler = {} end
if profiler[name] == nil then profiler[name] = game.create_profiler() end
local message = {...}
log({"", "[PROFILER]", " | ", name, " | ", table.concat({...}," "), " | ", profiler[name]})
profiler[name].reset()
end
function Logging:profilerStop()
if self.profiler == false then return end
if profiler ~= nil then
log({"", "[PROFILER]", " | ", "GLOBAL", " | ", "*** Profiler end ***", " | ", global_profiler})
log({"", "----------------------------------------------------------------------------------"})
global_profiler.stop()
global_profiler = nil
for _,profiler_step in pairs(profiler or {}) do
profiler_step.stop()
end
profiler = nil
end
end
function Logging:checkClass(logClass)
if debug_filter == "all" or debug_filter == logClass then return true end
return false
end
function Logging:updateLevel()
local level = "none"
if settings ~= nil and settings.global["helmod_debug"] then
level = settings.global["helmod_debug"].value
end
debug_level = self.debug_values[level] or 0
if settings ~= nil and settings.global["helmod_debug_filter"] then
debug_filter = settings.global["helmod_debug_filter"].value
end
end
function Logging:trace(...)
if self.debug_values.trace > debug_level then return end
local arg = {...}
self:logging("[TRACE]", self.debug_values.trace, unpack(arg))
end
function Logging:debug(...)
if self.debug_values.debug > debug_level then return end
local arg = {...}
self:logging("[DEBUG]", self.debug_values.debug, unpack(arg))
end
function Logging:info(...)
if self.debug_values.info > debug_level then return end
local arg = {...}
self:logging("[INFO]", self.debug_values.info, unpack(arg))
end
function Logging:warn(...)
if self.debug_values.warn > debug_level then return end
local arg = {...}
self:logging("[WARN ]", self.debug_values.warn, unpack(arg))
end
function Logging:error(...)
if self.debug_values.error > debug_level then return end
local arg = {...}
self:logging("[ERROR]", self.debug_values.error, unpack(arg))
end
function Logging:line(...)
if self.debug_values.debug > debug_level then return end
local arg = {...}
self:previousCall("[DEBUG]", unpack(arg))
end
function Logging:objectToString(object, level)
if level == nil then level = 0 end
local message = ""
if type(object) == "nil" then
message = message.." nil"
elseif type(object) == "boolean" then
if object then message = message.." true"
else message = message.." false" end
elseif type(object) == "number" then
message = message.." "..object
elseif type(object) == "string" then
message = message.."\""..object.."\""
elseif type(object) == "function" then
message = message.."\"__function\""
elseif object.isluaobject then
if object.valid then
local lua_type = object.object_name
if lua_type == "LuaCustomTable" then
local custom_table = {}
for _, element in pairs(object) do
table.insert(custom_table, element)
end
return self:objectToString(custom_table, level)
elseif string.find(lua_type, "Lua") then
local object_name = "unknown"
pcall(function() object_name = object.name end)
message = message..string.format("{\"type\":%q,\"name\":%q}", lua_type, object_name or "nil")
else
message = message..string.format("{\"type\":%q,\"name\":%q}", object.type or "nil", object.name or "nil")
end
else
message = message.."invalid object"
end
elseif type(object) == "table" then
if level <= self.limit then
local first = true
message = message.."{"
for key, nextObject in pairs(object) do
if not first then message = message.."," end
message = message.."\""..key.."\""..":"..self:objectToString(nextObject, level + 1);
first = false
end
message = message.."}"
else
message = message.."\"".."__table".."\""
end
end
return string.gsub(message,"\n","")
end
function Logging:logging(tag, level, logClass, ...)
local arg = {...}
if arg == nil then arg = "nil" end
if self:checkClass(logClass) then
local message = "";
for key, object in pairs(arg) do
message = message..self:objectToString(object)
end
local debug_info = debug.getinfo(3)
log(string.format("%s|%s|%s:%s|%s", tag, logClass, string.match(debug_info.source,"[^/]*$"), debug_info.currentline, message))
if append_log == false then append_log = true end
end
end
function Logging:previousCall(tag, logClass, back)
local debug_info = debug.getinfo(back+2)
log(string.format("%s|%s|%s:%s", tag, logClass, string.match(debug_info.source,"[^/]*$"), debug_info.currentline))
end