module(...,package.seeall) local logSize = 32 -- 单位kb local logDir = '/sdcard0/log' -- 日志目录 local logCnt = 50 -- 保留日志文件个数 function hex_tonumber(hex_str) local num = tonumber(hex_str, 16) return num end -- 数字进制转换 ---@param num number 十进制数字 ---@param hex number 转换的目标进制数(2-16) ---@return string function Dec2Hex(num, hex) if num == nil or type(num) ~= "number" then return num end if hex == nil then return num end local hexMap = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', "C", 'D', 'E', 'F'} local v = {} local s = math.floor(num / hex) local y = num % hex table.insert(v, 1, y) while s >= hex do y = s % hex table.insert(v, 1, y) s = math.floor(s / hex) end table.insert(v, 1, s) local r = "" for _, k in ipairs(v) do r = r .. hexMap[k + 1] end return r end -- 打开sd卡日志目录,不存在则创建,返回最新文件名称 function getLastFile(dirPath) log.info('open dir', io.opendir(dirPath)) if io.opendir(dirPath) ~= 0 then local file = {} -- 该目录所有文件名 for i = 1, 999 do local fType, fName, fSize = io.readdir() -- log.info("file or dir",fType, fName, fSize) if fType == 32 then log.info("sd card file", fName, fSize) file[i] = hex_tonumber(fName) -- local c = io.readFile(dirPath..'/'..fName) -- log.info('文件内容',c) elseif fType == nil then -- 文件个数达到设置值,删除旧文件 log.info('文件个数', i - 1) local min = nil -- 最旧的文件 即数字名称值最小的文件 for i, v in pairs(file) do if min == nil then min = v end if min > v then min = v end end log.info('min', min) if min then if i - 1 > logCnt then log.debug('del file path', dirPath .. '/' .. Dec2Hex(min, 16)) local del = os.remove(dirPath .. '/' .. Dec2Hex(min, 16)) log.info('del old file', del) end end break end end local max = nil -- 最新的文件 即数字名称值最大的文件 for i, v in pairs(file) do v = tonumber(v) --数组中是string类型 比较会有问题 if max == nil then max = v end if max < v then max = v end end if max then -- 判断该最新文件大小 local cnt = io.fileSize(dirPath .. '/' .. Dec2Hex(max, 16)) if cnt then if cnt >= (logSize * 1024) then -- 文件大于设置的文件大小 新建新文件 max = max + 1 end end io.closedir() return Dec2Hex(max, 16) else io.closedir() return nil end else local cdir = rtos.make_dir(dirPath) log.info('创建目录成功', cdir) end end -- 写入日志数据 function debug_log(msg) local dirPath = logDir local file = getLastFile(dirPath) if file then log.debug('last file name', file) file = dirPath .. '/' .. file else file = dirPath .. '/' .. Dec2Hex(1, 16) end log.info('filepath', type(file), file) local t = os.date("*t") t = string.format("%04d-%02d-%02d %02d:%02d:%02d", t.year, t.month, t.day, t.hour, t.min, t.sec) log.info('当前时间:', t) local msg = t .. ' ' .. msg .. '\n' local c = io.writeFile(file, msg, "a+b") if c then log.info('msg', msg) else log.error('error', '日志文件写入失败') end end -- 读取日志 --[[ 函数名:readfile(filename) 功能:打开所输入文件名的文件,并输出储存在里面额内容 参数:完整路径文件名 返回值:无 ]] function readfile(filename) -- 打开指定文件并输出内容 filename = nil打开最新文件 if not filename or filename == '/sdcard0/log/0' then filename = logDir .. '/' .. getLastFile(logDir) end local headval = '文件名' .. filename .. '\n' -- 文件头部 local fileval = nil -- 文件内容 local filehandle = io.open(filename, "r") -- 第一个参数是文件名,第二个是打开方式,'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开 if filehandle then -- 判断文件是否存在 fileval = filehandle:read("*all") -- 读出文件内容 if fileval then filehandle:close() -- 关闭文件 else fileval = "文件为空" -- 文件不存在 end else fileval = "文件不存在或文件输入格式不正确" -- 打开失败 end return headval..fileval end