local Logger = {}
-- 全局的print,必须使用封装的Logger
if not EDITOR_MODE then
print = function(...)
Logger.log(...)
end
end
Logger.tab = " "
Logger.MANUAL_ENABLE_DEBUG = false -- 手动控制激活打印
Logger.ENABLE_TIMES = 5 -- 激活需要的操作次数
local function split(input, delimiter)
input = tostring(input)
delimiter = tostring(delimiter)
if (delimiter=='') then return false end
local pos,arr = 0, {}
-- for each divider found
for st,sp in function() return string.find(input, delimiter, pos, true) end do
table.insert(arr, string.sub(input, pos, st - 1))
pos = sp + 1
end
table.insert(arr, string.sub(input, pos))
return arr
end
local formatTable
formatTable = function(tal, _depth)
if IS_PUBLISH and not Logger.MANUAL_ENABLE_DEBUG then
return
end
if type(tal) ~= "table" then
return tostring(tal)
else
local _depth = _depth or 0
local getTab = function()
local r = ""
for _ = 1, _depth do
r = r.. Logger.tab
end
return r
end
local result = "{\n"
_depth = _depth + 1
for k, v in pairs(tal) do
if type(v) ~= "table" then
result = result.. getTab().. tostring(k).. " = ".. tostring(v).. "\n"
else
result = result.. getTab().. tostring(k).. " = ".. formatTable(v, _depth + 1) .. "\n"
end
end
result = result.. getTab().. "}"
return result
end
end
Logger.printTable = function(tbl)
if IS_PUBLISH and not Logger.MANUAL_ENABLE_DEBUG then
return
end
Logger.log(formatTable(tbl))
end
Logger.printTableWarning = function(tbl)
if IS_PUBLISH and not Logger.MANUAL_ENABLE_DEBUG then
return
end
Logger.logWarning(formatTable(tbl))
end
Logger.printTableError = function(tbl)
if IS_PUBLISH and not Logger.MANUAL_ENABLE_DEBUG then
return
end
Logger.logError(formatTable(tbl))
end
Logger.log = function(fmt, ...)
if IS_PUBLISH and not Logger.MANUAL_ENABLE_DEBUG then
return
end
Logger._log("INFO", fmt, ...)
end
Logger.logTodo = function(fmt, ...)
if IS_PUBLISH and not Logger.MANUAL_ENABLE_DEBUG then
return
end
local t = { string.format(tostring(fmt), ...), }
local traceback = split(debug.traceback("", 2), "\n")
CS.UnityEngine.Debug.Log("[TODO] " .. table.concat(t) .. "" .. table.concat(traceback, "\n"))
end
Logger.logHighlight = function(fmt, ...)
if IS_PUBLISH and not Logger.MANUAL_ENABLE_DEBUG then
return
end
local t = { string.format(tostring(fmt), ...), }
local traceback = split(debug.traceback("", 2), "\n")
CS.UnityEngine.Debug.Log("" .. table.concat(t) .. "" .. table.concat(traceback, "\n"))
end
Logger.logWarning = function(fmt, ...)
if IS_PUBLISH and not Logger.MANUAL_ENABLE_DEBUG then
return
end
Logger._log("WARNING", fmt, ...)
end
Logger.logError = function(fmt, ...)
if IS_PUBLISH and not Logger.MANUAL_ENABLE_DEBUG then
return
end
Logger._log("ERROR", fmt, ...)
end
Logger.logFatal = function(fmt, ...)
if IS_PUBLISH and not Logger.MANUAL_ENABLE_DEBUG then
return
end
Logger._log("FATAL", fmt, ...)
end
Logger.logWarningBox = function(fmt, ...)
if IS_PUBLISH and not Logger.MANUAL_ENABLE_DEBUG then
return
end
local content = Logger._log("WARNING", fmt, ...)
local params = {
content = content,
okText = I18N:getGlobalText(I18N.GlobalConst.BTN_TEXT_OK),
noShowClose = true,
okFunc = function() end,
boxType = GConst.MESSAGE_BOX_TYPE.MB_OK,
top = true,
}
GFunc.showMessageBox(params)
end
Logger._log = function(tag, fmt, ...)
if IS_PUBLISH and not Logger.MANUAL_ENABLE_DEBUG then
return
end
local str = Logger._checkPercentSign(fmt)
local t = { string.format(tostring(str), ...), }
local traceback = split(debug.traceback("", 2), "\n")
local output
if tag == "FATAL" then
output = table.concat(t) ..table.concat(traceback, "\n")
CS.UnityEngine.Debug.LogError(output)
elseif tag == "ERROR" then
CS.UnityEngine.Debug.Log("" .. table.concat(t) .. "" .. table.concat(traceback, "\n"))
elseif tag == "WARNING" then
output = table.concat(t) ..table.concat(traceback, "\n")
CS.UnityEngine.Debug.LogWarning(output)
else
output = table.concat(t) ..table.concat(traceback, "\n")
CS.UnityEngine.Debug.Log(output)
end
return output
end
local function dump_value_(v)
if type(v) == "string" then
v = "\"" .. v .. "\""
end
return tostring(v)
end
Logger.dump = function(value, description, nesting)
if IS_PUBLISH then
return
end
if type(nesting) ~= "number" then nesting = 3 end
local lookupTable = {}
local result = {}
local traceback = split(debug.traceback("", 2), "\n")
CS.UnityEngine.Debug.Log("dump from: " .. string.trim(traceback[3]))
local function dump_(value, description, indent, nest, keylen)
description = description or ""
local spc = ""
if type(keylen) == "number" then
spc = string.rep(" ", keylen - string.len(dump_value_(description)))
end
if type(value) ~= "table" then
result[#result +1 ] = string.format("%s%s%s = %s", indent, dump_value_(description), spc, dump_value_(value))
elseif lookupTable[tostring(value)] then
result[#result +1 ] = string.format("%s%s%s = *REF*", indent, dump_value_(description), spc)
else
lookupTable[tostring(value)] = true
if nest > nesting then
result[#result +1 ] = string.format("%s%s = *MAX NESTING*", indent, dump_value_(description))
else
result[#result +1 ] = string.format("%s%s = {", indent, dump_value_(description))
local indent2 = indent.." "
local keys = {}
local keylen = 0
local values = {}
for k, v in pairs(value) do
keys[#keys + 1] = k
local vk = dump_value_(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, description, "- ", 1)
for i, line in ipairs(result) do
CS.UnityEngine.Debug.Log(line)
end
end
Logger._checkPercentSign = function (str)
if str == nil then
return nil
end
str = tostring(str)
local strTable = {}
for i = 1, #str do
table.insert(strTable, str:sub(i,i))
end
local count = #strTable
local specialChars = {"s","p","c","w","a","l","u","d","x","z",}
for i = count, 1, -1 do
if strTable[i] == '%' and (i + 1) <= count then
local pattern = false
for _, char in ipairs(specialChars) do
if strTable[i + 1] == char then
pattern = true
break
end
end
if not pattern then
table.insert(strTable, i + 1, "%")
end
elseif strTable[i] == '%' and i == count then
table.insert(strTable, "%")
end
end
return table.concat(strTable)
end
return Logger