lua日志实现--打印table

时间:2025-03-02 07:34:37
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