123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- 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
|