如何在 KOReader 代码中加入 logger.dbg 调试输出并查看 crash.log 日志
【免费下载链接】koreaderAn ebook reader application supporting PDF, DjVu, EPUB, FB2 and many more formats, running on Cervantes, Kindle, Kobo, PocketBook and Android devices项目地址: https://gitcode.com/GitHub_Trending/ko/koreader
如果你在 KOReader 的 Lua 代码里加了logger.dbg(...)调用,但运行时看不到任何输出,原因通常是日志级别没有打开:frontend/logger.lua 在加载末尾默认执行Logger:setLevel(LOG_LVL.info),级别为info时dbg函数是 noop,什么都不会打印。这篇文章介绍如何在代码中写入logger.dbg调试输出、如何打开 debug 日志级别,以及最终去哪里核对 doc/Hacking.md 所说的crash.log日志。
在代码中写入 logger.dbg 调试输出
doc/Hacking.md 给出的标准用法是:
local logger = require("logger") a = {"1", "2", "3"} logger.dbg("table a: ", a)两个参数要点来自 frontend/logger.lua:
- 所有经过
logger.dbg打印的行都以DEBUG开头(前缀定义在LOG_PREFIX表中:dbg = "DEBUG"、info = "INFO "、warn = "WARN "、err = "ERROR")。 - 传进去的 table 会被 serpent 序列化后打印,嵌套最多展开到
DEFAULT_DUMP_LVL(值为 10)层,缩进两个空格。
打开 debug 日志级别
logger.dbg只有在日志级别被设为dbg时才会真正输出。frontend/logger.lua 中的Logger:setLevel(new_lvl)会把小于等于指定级别的所有级别切换为真实函数,其余置为 noop;例如 frontend/dbg.lua 的Dbg:turnOn()就是调用logger:setLevel(logger.levels.dbg)来开启 debug 日志的。实际开发中有三条打开方式:
方式一:启动参数-d
reader.lua 的启动参数支持:
-d start in debug mode -v debug in verbose mode也就是以./reader.lua -d启动进入 debug 模式,-v再叠加 verbose 模式。-d会调用dbg:turnOn(),-v调用dbg:setVerbose(true)。注意 reader.lua 中的注释:debug 选项要在加载其他模块之前就检查并打开,否则部分模块加载期的 DEBUG 输出会丢失,所以不要自己改成在业务模块里才开启。
方式二:设置项debug
reader.lua 启动时读取设置文件:
if G_reader_settings:isTrue("debug") then dbg:turnOn() end if G_reader_settings:isTrue("debug") and G_reader_settings:isTrue("debug_verbose") then dbg:setVerbose(true) end即数据目录下settings.reader.lua中debug为 true 时自动进入 debug 模式。这个设置也可以通过界面操作(见方式三),两条路径最终写入的是同一个设置项。
方式三:界面菜单切换
- 设置菜单里的Developer options子菜单中有 “Enable debug logging” 选项,切换时翻转
debug设置并调用dbg:turnOn()/dbg:turnOff();“Enable verbose debug logging” 只在debug已开启时可用(见 frontend/apps/filemanager/filemanagermenu.lua)。 - 通用信息菜单中的 “Report a bug” 条目提供 “Enable/Disable verbose logging” 按钮,会同时打开
debug与debug_verbose两个设置并提示重启 KOReader,其说明文字也会直接给出 crash.log 的路径(见 frontend/ui/elements/common_info_menu_table.lua)。
查看 crash.log 中的输出
在大多数目标平台上,日志输出保存在koreader目录的crash.log中。平台启动脚本负责把标准输出重定向到该文件,例如 platform/kindle/koreader.sh:
./reader.lua "$@" >>crash.log 2>&1而 frontend/logger.lua 在非 Android 平台下正是通过io.write写标准输出的,因此打开 debug 模式后,你在代码里写的logger.dbg(...)会随启动流程一并落盘到 crash.log。doc/Hacking.md 给出的文档示例输出为:
04/06/17-21:44:53 DEBUG foo(以上为文档中的示例行,实际时间戳与内容以你的运行结果为准。)验证方式就是打开koreader目录下的crash.log,找到带DEBUG前缀、包含你写入内容的行。
生产代码中的性能注意
doc/Hacking.md 特别提醒:在 Lua 中,函数参数总是会被求值,即使当前级别是 noop,logger.dbg的参数也已经计算过了。因此不要把复杂计算内联在 logger 函数的参数里;如果确实需要,把整段逻辑放在dbg.is_on分支后面。仓库里的现成例子见 frontend/device/input.lua 中对按键事件日志的处理:
if DEBUG.is_on then if event.type == C.EV_KEY then logger.dbg(string.format( "key event => code: %d (%s), value: %s, time: %d.%06d", ...)) end end限制与边界
- 日志级别默认为
info,不开启 debug 模式时logger.dbg不产生任何输出,这是“加了日志却看不到”的常见原因。 crash.log的保存适用于“大多数目标平台”(doc/Hacking.md 原文)。Android 平台下 frontend/logger.lua 不走io.write,而是把各级别映射到android.LOGV/LOGI/LOGW/LOGE,日志进入 Android 的日志通道而非crash.log,Android 上要改用对应的日志查看方式。- 调试完成后记得把
debug设置关回(菜单中取消勾选或重新进入 Report a bug 条目切换 verbose logging),否则所有DEBUG级输出会持续写入日志。
【免费下载链接】koreaderAn ebook reader application supporting PDF, DjVu, EPUB, FB2 and many more formats, running on Cervantes, Kindle, Kobo, PocketBook and Android devices项目地址: https://gitcode.com/GitHub_Trending/ko/koreader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考