bayuMIR/Mirserver/Mir200/Envir/3rd/log/Logger.lua
2026-06-12 00:25:44 +08:00

158 lines
No EOL
4.2 KiB
Lua

-- 日志文件路径
local logpath = string.format("3rd/debug_log/%s.log", os.date("%Y%m%d"))
-- 创建日志文件夹
function LOGCreate()
os.execute("mkdir \"3rd/debug_log\" >nul 2>nul")
end
-- 将表中的元素连接成字符串
local function concat(t)
local ret = ""
for _, v in pairs(t) do
if string.len(ret) == 0 then
ret = tostring(v)
else
ret = ret .. " " .. tostring(v)
end
end
return ret
end
-- 获取当前时间戳
local function timestamp()
local t = os.date("*t")
return string.format("[%04d-%02d-%02d %02d:%02d:%02d]",
t.year, t.month, t.day, t.hour, t.min, t.sec)
end
-- 获取源代码行信息
local function src_line(debug_level)
local info = debug.getinfo(debug_level)
local filename = string.match(info.short_src, "[^/.]+.lua")
return string.format("[%s:%d]", filename, info.currentline)
end
-- 写入日志
local function _write(...)
local f = io.open(logpath, "a")
if f then
local str = timestamp()..src_line(4).." "..concat({...})
f:write(str.."\n")
f:close()
end
end
-- 打印表的内容到日志文件
local function _dump(value, desciption, nesting)
local f = io.open(logpath, "a")
if not f then return end
if desciption then
desciption = timestamp()..src_line(4)..desciption
else
desciption = timestamp()..src_line(4)
end
if type(nesting) ~= "number" then nesting = 3 end
local lookupTable = {}
local result = {}
local function _v(v)
if type(v) == "string" then
v = "\"" .. v .. "\""
end
return tostring(v)
end
local traceback = string.split(debug.traceback("", 2), "\n")
-- print("dump from: " .. string.trim(traceback[3]))
local function _dump(value, desciption, indent, nest, keylen)
desciption = desciption or "<var>"
local spc = ""
if type(keylen) == "number" then
spc = string.rep(" ", keylen - string.len(_v(desciption)))
end
if type(value) ~= "table" then
result[#result +1 ] = string.format("%s%s%s = %s", indent, _v(desciption), spc, _v(value))
elseif lookupTable[value] then
result[#result +1 ] = string.format("%s%s%s = *REF*", indent, desciption, spc)
else
lookupTable[value] = true
if nest > nesting then
result[#result +1 ] = string.format("%s%s = *MAX NESTING*", indent, desciption)
else
result[#result +1 ] = string.format("%s%s = {", indent, _v(desciption))
local indent2 = indent.." "
local keys = {}
local keylen = 0
local values = {}
for k, v in pairs(value) do
keys[#keys + 1] = k
local vk = _v(k)
local vkl = string.len(vk)
if vkl > keylen then keylen = vkl end
values[k] = v
end
table.sort(keys, function(a, b)
if type(a) == "number" and type(b) == "number" then
return a < b
else
return tostring(a) < tostring(b)
end
end)
for i, k in ipairs(keys) do
_dump(values[k], k, indent2, nest + 1, keylen)
end
result[#result +1] = string.format("%s}", indent)
end
end
end
_dump(value, desciption, "- ", 1)
for i, line in ipairs(result) do
f:write(line.."\n")
end
f:close()
end
-- 打印日志到控制台
local function _print(...)
local str = timestamp()..src_line(4).." "..concat({...})
release_print(str)
end
-- 是否开启调试模式
local DEBUG = true --debug模式,true打印日志
-- local DEBUG = false
-- 打印日志
function LOGPrint(...)
if not DEBUG then return end
_print(...)
end
-- 写入日志
function LOGWrite(...)
if not DEBUG then return end
_write(...)
end
-- 打印表的内容到日志文件
function LOGDump(value, desciption, nesting)
if not DEBUG then return end
_dump(value, desciption, nesting)
end
-- 打印调用堆栈到日志文件
function LOGStack()
local str = debug.traceback()
LOGWrite(str)
end