news 2026/9/12 8:33:09

如何在 KOReader 代码中加入 logger.dbg 调试输出并查看 crash.log 日志

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何在 KOReader 代码中加入 logger.dbg 调试输出并查看 crash.log 日志

如何在 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),级别为infodbg函数是 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.luadebug为 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” 按钮,会同时打开debugdebug_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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 8:32:08

解决matplotlib中文乱码与负号显示问题

1. 问题背景与现象描述第一次用matplotlib画带中文标签的图表时,那个乱码显示真是让人头大。明明在代码里写的是"销售额统计",生成的图表上却变成了一堆小方框。更糟的是,当数据出现负值时,连负号都显示不出来&#xff…

作者头像 李华
网站建设 2026/9/12 8:30:15

二叉树前序序列化验证:栈与缩点算法解析

1. 项目概述:当二叉树遇上栈与缩点第一次看到这个题目时,我正喝着咖啡差点喷出来——"栈与缩点的艺术"听起来像某种抽象派画展,而"前序序列化合法性判定"又像编译器原理课的作业。但当我真正开始研究这个问题时&#xff…

作者头像 李华
网站建设 2026/9/12 8:30:11

高校学科竞赛管理系统的Java实现与架构设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 8:30:10

Python性能优化:从基础技巧到高级实践

1. Python性能优化概述作为一名使用Python超过10年的开发者,我见过太多本可以运行得更快的代码因为缺乏优化而变得缓慢。Python作为解释型语言,其执行效率确实不如C/C等编译型语言,但这并不意味着我们只能接受缓慢的执行速度。通过合理的优化…

作者头像 李华
网站建设 2026/9/12 8:29:20

预测回滚在多物理碰撞场景下的失效排查与平滑修复

预测回滚在多物理碰撞场景下的失效排查与平滑修复在网络联机游戏的客户端预测与回滚(Prediction & Rollback)架构中,单角色的自由位移预测相对容易保持一致。然而,一旦场景中引入多角色近身挤压、推搡刚体箱子、物理载具冲撞或…

作者头像 李华