lua将table类型变量转换成string类型函数serialize和一个简单的日志写入函数write_log
lua
-- 定义日志文件路径和最大行数
local log_file = "/tmp/lua_log"
local max_lines = 20000 -- 设置最大行数
-- 定义一个简单的table序列化函数
function serialize(tbl)
local result = {}
for k, v in pairs(tbl) do
-- 处理键
if type(k) == "string" and string.match(k, "^%a[%w_]*$") then
table.insert(result, k .. " = ")
else
table.insert(result, "[" .. tostring(k) .. "] = ")
end
-- 处理值
if type(v) == "table" then
table.insert(result, "{" .. serialize(v) .. "},")
elseif type(v) == "string" then
table.insert(result, string.format("%q", v) .. ",")
else
table.insert(result, tostring(v) .. ",")
end
end
return table.concat(result)
end
-- 检查并可能清空日志文件
local function check_and_clear_log()
local f, err = io.open(log_file, "r")
if not f then
dbg("无法打开日志文件: " .. err)
return
end
local lines = {}
for line in f:lines() do
table.insert(lines, line)
end
f:close()
if #lines >= max_lines then
-- 清空文件
f, err = io.open(log_file, "w")
if not f then
dbg("无法打开日志文件以清空: " .. err)
return
end
f:close()
end
end
-- 写入日志
function write_log(message)
check_and_clear_log() -- 在每次写入前检查是否需要清空文件
message = os.date("%Y-%m-%d %H:%M:%S - ") .. os.time().." - "..message
local f, err = io.open(log_file, "a+")
if not f then
dbg("无法打开日志文件进行追加: " .. err)
return
end
f:write(message .. "\n") -- 写入消息并换行
f:close()
end