1、@zybwh 发现论坛和SIG组都没有framework类别,我理解这一类问题应该是归属到框架的
2、发现如果不设置module_name,plugin中添加的打印既不会打印到framework.log也不会打印到app.log;调用log:set_log_module_name后就可以打印到app.log,想问一下这是一个机制还是BUG
伴随更多的在社区的框架改动,框架SIG会考虑创建,当前问题就现在交流互助区解答吧
答案内容由AI生成,仅供参考:
关于未设置 module_name 时线程日志的打印去向问题,结合提供的知识库内容,分析如下:
1. 未设置 module_name 时,日志会打印到哪里?
根据知识库中的文档内容:
-
在
service/main.lua中,必须显式设置module_name,通过以下代码实现:local module_name = skynet.getenv('MODULE_NAME') if type(module_name) == 'string' and module_name ~= '' then log:set_log_module_name(module_name) end -
log:set_log_module_name()是日志路由的关键机制。该函数将当前线程或组件的日志输出绑定到特定模块名,从而决定日志被写入哪个目标文件(如app.log或framework.log)。 -
若未调用
log:set_log_module_name(),则:-
日志系统无法识别该日志属于哪个组件或模块。
-
根据文档中“如果不设置
module_name,plugin 中添加的打印既不会打印到framework.log也不会打印到app.log”的观察,可以确认:未设置
module_name的日志将被丢弃或静默忽略,不会写入任何日志文件。
-
-
这不是“默认输出到某个位置”,而是日志系统依赖模块名进行分类和路由,未定义模块名时,日志无归属,因此不被记录。
2. 这是一个机制还是 BUG?
这是一个设计机制,而非 BUG。
理由如下:
| 依据 | 说明 |
|---|---|
| 日志分类机制明确 | 根据《【教学培训篇】OpenUBMC调试能力》(ID:9),日志分为:- framework.log:框架组件日志- app.log:非框架组件(即应用/插件)日志两者均需通过 module_name 区分归属。 |
module_name 是路由标识 |
log:set_log_module_name() 是 OpenUBMC 日志系统中用于标识日志来源模块的核心接口。未设置时,日志系统无法判断应写入 app.log 还是 framework.log,故选择不输出,避免污染日志。 |
| 官方推荐做法 | 在 main.lua 示例中,明确要求设置 MODULE_NAME 环境变量并调用 log:set_log_module_name(),说明这是强制性配置步骤,非可选。 |
| 避免日志混乱 | 若允许无模块名日志随意输出,将导致日志文件中混入来源不明的条目,严重影响调试和运维。因此,静默丢弃无归属日志是合理的设计决策。 |
| 验证行为一致 | 用户观察到“设置后可写入 app.log”,与文档中“组件日志写入 app.log”(见 mc.logging 描述)完全一致,进一步验证该机制是预期行为。 |
结论
没有设置
module_name的线程日志不会被打印到任何文件(包括framework.log和app.log)——这是 OpenUBMC 日志系统的设计机制,而非 Bug。
建议做法:
为确保日志正常输出,每个组件的 main.lua 入口都必须设置 module_name:
-- 在 main.lua 中确保设置模块名
local module_name = skynet.getenv('MODULE_NAME')
if module_name then
log:set_log_module_name(module_name)
end
同时,在 systemd 或 Skynet 配置中,确保 MODULE_NAME 环境变量被正确定义(如 MODULE_NAME = ""bmc_core"")。
补充说明:日志文件归属规则
| 模块名示例 | 日志输出文件 |
|---|---|
bmc_core, ipmi_core 等框架组件 |
framework.log |
firmware_mgmt, sensor, hwdiscovery 等应用组件 |
app.log |
未设置 module_name |
无输出(静默丢弃) |
此机制保障了日志系统的可维护性和可追溯性,是 OpenUBMC 架构中关键的可观测性设计。"
但是main.lua设置的module_name并不会被下属的plugin和so动态库继承,以storage组件为例,我都需要手动添加i2c读写插件和SML动态库的module_name才能让它们打印到app.log
我理解框架应该要提供这种继承能力
这个有个差别在于插件在哪运行的,之前默认在运行app打印日志,结果插件日志刷屏导致app关键日志刷没了。所以后面还是改成了显性化声明,这样子简单点
我刚试了一下,hwproxy的plugin应该是在hwproxy里打印的,在framework.log里面