没有设置module_name的线程日志会打印到哪里

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.logframework.log)。

  • 若未调用 log:set_log_module_name(),则:

    • 日志系统无法识别该日志属于哪个组件或模块

    • 根据文档中“如果不设置 module_name,plugin 中添加的打印既不会打印到 framework.log 也不会打印到 app.log”的观察,可以确认:

      未设置 module_name 的日志将被丢弃或静默忽略,不会写入任何日志文件

  • 这不是“默认输出到某个位置”,而是日志系统依赖模块名进行分类和路由,未定义模块名时,日志无归属,因此不被记录


2. 这是一个机制还是 BUG?

这是一个设计机制,而非 BUG。

:white_check_mark: 理由如下:

依据 说明
日志分类机制明确 根据《【教学培训篇】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 描述)完全一致,进一步验证该机制是预期行为

:white_check_mark: 结论

没有设置 module_name 的线程日志不会被打印到任何文件(包括 framework.logapp.log)——这是 OpenUBMC 日志系统的设计机制,而非 Bug。

:hammer_and_wrench: 建议做法:

为确保日志正常输出,每个组件的 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"")。


:magnifying_glass_tilted_left: 补充说明:日志文件归属规则

模块名示例 日志输出文件
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关键日志刷没了。所以后面还是改成了显性化声明,这样子简单点

1 个赞

我刚试了一下,hwproxy的plugin应该是在hwproxy里打印的,在framework.log里面