logModuel.lua 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. module(...,package.seeall)
  2. local logSize = 32 -- 单位kb
  3. local logDir = '/sdcard0/log' -- 日志目录
  4. local logCnt = 50 -- 保留日志文件个数
  5. function hex_tonumber(hex_str)
  6. local num = tonumber(hex_str, 16)
  7. return num
  8. end
  9. -- 数字进制转换
  10. ---@param num number 十进制数字
  11. ---@param hex number 转换的目标进制数(2-16)
  12. ---@return string
  13. function Dec2Hex(num, hex)
  14. if num == nil or type(num) ~= "number" then return num end
  15. if hex == nil then return num end
  16. local hexMap = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', "C", 'D', 'E', 'F'}
  17. local v = {}
  18. local s = math.floor(num / hex)
  19. local y = num % hex
  20. table.insert(v, 1, y)
  21. while s >= hex do
  22. y = s % hex
  23. table.insert(v, 1, y)
  24. s = math.floor(s / hex)
  25. end
  26. table.insert(v, 1, s)
  27. local r = ""
  28. for _, k in ipairs(v) do r = r .. hexMap[k + 1] end
  29. return r
  30. end
  31. -- 打开sd卡日志目录,不存在则创建,返回最新文件名称
  32. function getLastFile(dirPath)
  33. log.info('open dir', io.opendir(dirPath))
  34. if io.opendir(dirPath) ~= 0 then
  35. local file = {} -- 该目录所有文件名
  36. for i = 1, 999 do
  37. local fType, fName, fSize = io.readdir()
  38. -- log.info("file or dir",fType, fName, fSize)
  39. if fType == 32 then
  40. log.info("sd card file", fName, fSize)
  41. file[i] = hex_tonumber(fName)
  42. -- local c = io.readFile(dirPath..'/'..fName)
  43. -- log.info('文件内容',c)
  44. elseif fType == nil then
  45. -- 文件个数达到设置值,删除旧文件
  46. log.info('文件个数', i - 1)
  47. local min = nil -- 最旧的文件 即数字名称值最小的文件
  48. for i, v in pairs(file) do
  49. if min == nil then min = v end
  50. if min > v then min = v end
  51. end
  52. log.info('min', min)
  53. if min then
  54. if i - 1 > logCnt then
  55. log.debug('del file path',
  56. dirPath .. '/' .. Dec2Hex(min, 16))
  57. local del =
  58. os.remove(dirPath .. '/' .. Dec2Hex(min, 16))
  59. log.info('del old file', del)
  60. end
  61. end
  62. break
  63. end
  64. end
  65. local max = nil -- 最新的文件 即数字名称值最大的文件
  66. for i, v in pairs(file) do
  67. v = tonumber(v) --数组中是string类型 比较会有问题
  68. if max == nil then max = v end
  69. if max < v then max = v end
  70. end
  71. if max then
  72. -- 判断该最新文件大小
  73. local cnt = io.fileSize(dirPath .. '/' .. Dec2Hex(max, 16))
  74. if cnt then
  75. if cnt >= (logSize * 1024) then -- 文件大于设置的文件大小 新建新文件
  76. max = max + 1
  77. end
  78. end
  79. io.closedir()
  80. return Dec2Hex(max, 16)
  81. else
  82. io.closedir()
  83. return nil
  84. end
  85. else
  86. local cdir = rtos.make_dir(dirPath)
  87. log.info('创建目录成功', cdir)
  88. end
  89. end
  90. -- 写入日志数据
  91. function debug_log(msg)
  92. local dirPath = logDir
  93. local file = getLastFile(dirPath)
  94. if file then
  95. log.debug('last file name', file)
  96. file = dirPath .. '/' .. file
  97. else
  98. file = dirPath .. '/' .. Dec2Hex(1, 16)
  99. end
  100. log.info('filepath', type(file), file)
  101. local t = os.date("*t")
  102. t = string.format("%04d-%02d-%02d %02d:%02d:%02d", t.year, t.month, t.day,
  103. t.hour, t.min, t.sec)
  104. log.info('当前时间:', t)
  105. local msg = t .. ' ' .. msg .. '\n'
  106. local c = io.writeFile(file, msg, "a+b")
  107. if c then
  108. log.info('msg', msg)
  109. else
  110. log.error('error', '日志文件写入失败')
  111. end
  112. end
  113. -- 读取日志
  114. --[[
  115. 函数名:readfile(filename)
  116. 功能:打开所输入文件名的文件,并输出储存在里面额内容
  117. 参数:完整路径文件名
  118. 返回值:无 ]]
  119. function readfile(filename) -- 打开指定文件并输出内容 filename = nil打开最新文件
  120. if not filename or filename == '/sdcard0/log/0' then
  121. filename = logDir .. '/' .. getLastFile(logDir)
  122. end
  123. local headval = '文件名' .. filename .. '\n' -- 文件头部
  124. local fileval = nil -- 文件内容
  125. local filehandle = io.open(filename, "r") -- 第一个参数是文件名,第二个是打开方式,'r'读模式,'w'写模式,对数据进行覆盖,'a'附加模式,'b'加在模式后面表示以二进制形式打开
  126. if filehandle then -- 判断文件是否存在
  127. fileval = filehandle:read("*all") -- 读出文件内容
  128. if fileval then
  129. filehandle:close() -- 关闭文件
  130. else
  131. fileval = "文件为空" -- 文件不存在
  132. end
  133. else
  134. fileval = "文件不存在或文件输入格式不正确" -- 打开失败
  135. end
  136. return headval..fileval
  137. end