lua日志实现--打印table
local rpc_log_off = 0 -- 1关闭log,0打开log
local function write_file(fd,str)
if fd then
fd:write(str .. '\n')
end
end
local function dump_value_(v)
if type(v) == "string" then
v = "\"" .. v .. "\""
end
return tostring(v)
end
local function split(input, delimiter)
input = tostring(input)
delimiter = tostring(delimiter)
if (delimiter == "") then return false end
local pos, arr = 0, {}
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 function trim(input)
return (string.gsub(input, "^%s*(.-)%s*$", "%1"))
end
local function dump(dbg,value, desciption, nesting)
if type(nesting) ~= "number" then nesting = 3 end
local lookupTable = {}
local result = {}
local traceback = split(debug.traceback("", 2), "\n")
-- print("dump from: " .. 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(dump_value_(desciption)))
end
if type(value) ~= "table" then
result[#result +1 ] = string.format("%s%s%s = %s", indent, dump_value_(desciption), spc, dump_value_(value))
elseif lookupTable[tostring(value)] then
result[#result +1 ] = string.format("%s%s%s = *REF*", indent, dump_value_(desciption), spc)
else
lookupTable[tostring(value)] = true
if nest > nesting then
result[#result +1 ] = string.format("%s%s = *MAX NESTING*", indent, dump_value_(desciption))
else
result[#result +1 ] = string.format("%s%s = {", indent, dump_value_(desciption))
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, desciption, "- ", 1)
local len = dbg:seek("end")
if len > (2*1024*1024) then
os.execute("echo '' > /tmp/")
end
for i, line in ipairs(result) do
write_file(dbg,line)
end
end
local function print_string(dbg,str)
write_file(dbg,str)
end
--[[
打印table的工具函数
@params data 需要打印的内容
@params key 描述
@params depth 打印内容的嵌套级数,默认3级
]]
function print_r(data, key, depth)
if not key then
key = ""
end
if not depth then
depth = 3
end
local dbg = io.open("/tmp/", "w+")
if rpc_log_off == 0 then
if (type(data) == "table") then
dump(dbg,data,key,depth)
elseif (type(data) == "string") then
print_string(dbg,key .. data);
end
else
--log off
end
if dbg then
dbg:close()
end
end