怎么调整app.log日志的打印等级

问题描述

如题,怎么通过修改代码调整app.log、framework.log等日志的打印等级,让它不要打印notice、warn,只打印error及以上等级信息。

环境信息

  • 软件版本:OpenUBMC2509

期望结果

app.log等日志只打印error及以上的信息

尝试过的解决方案

  1. 修改 OpenUBMC/libmcpp/src/log/log_manager.cpp 文件中63行左右 default_logger.set_level(mc::log::level::notice); 将notice改为error无效。
  2. 修改 OpenUBMC/libmcpp/stub/logging_internal.h 文件中28行 guint level : 4; ,将4改为6无效
  3. 尝试在OpenUBMC/frudata/src里给调用过log:notice等函数的lua文件,全部在引用下方,加上全局日志等级设置log:setLevel(log.ERROR),无效。

答案内容由AI生成,仅供参考:

:white_check_mark: 总结:推荐操作步骤

  1. 临时测试

    busctl set-property bmc.kepler.LogManager /bmc/kepler/LogManager LogLevel s "error"
    
  2. 持久化配置
    创建 systemd 服务自动设置日志级别。

  3. 验证
    检查 app.log 是否不再出现 noticewarning,但仍有 error

点击此处查看详细分析解答

如何调整 app.log 日志打印等级

根据您的问题描述,您希望将 app.log 等日志文件的输出级别调整为仅打印 ERROR 及以上级别的日志,即屏蔽 NOTICE、WARNING、INFO 等较低级别的日志信息。以下是基于 OpenUBMC2509 环境的正确调整方法。


:magnifying_glass_tilted_left: 问题分析

您尝试的几种方式未生效的原因如下:

  1. 修改 log_manager.cpp 中默认级别无效
    原因:即使代码中设置了默认级别,系统层面或运行时可能通过其他机制(如 D-Bus 配置、组件独立设置)覆盖了该值,导致修改编译时默认值无效。

  2. 修改 logging_internal.h 的位字段大小无效
    原因:level : 4 是位域定义,用于节省内存,并不控制日志级别的过滤行为,修改它不会影响日志输出逻辑。

  3. 在 Lua 文件中调用 log:setLevel(log.ERROR) 无效
    原因:mc.logging 模块的 setLevel 接口可能未被全局生效,或者组件日志级别是在初始化阶段就被框架统一配置,后续设置被忽略。


:white_check_mark: 正确解决方案

:white_check_mark: 方法一:使用 busctl 命令设置全局日志级别(推荐)

在 OpenUBMC 系统中,busctl 是标准的日志级别控制工具,通过 D-Bus 接口动态设置日志级别。

:white_check_mark: 设置命令:

busctl set-property bmc.kepler.LogManager /bmc/kepler/LogManager bmc.kepler.LogManager LogLevel s "error"

:bell: 支持的日志级别(按严重性升序):

  • debug
  • info
  • notice
  • warning
  • error

设置为 "error" 后,只会输出 ERROR 及以上(若有 fatal)的日志,自动屏蔽 notice、warning、info、debug。

:white_check_mark: 验证当前日志级别:

busctl get-property bmc.kepler.LogManager /bmc/kepler/LogManager bmc.kepler.LogManager LogLevel

:white_check_mark: 方法二:在 Lua 组件中正确设置日志级别(局部生效)

若您希望某个特定组件只输出 error 日志,可在其 Lua 代码中正确设置:

local log = require 'mc.logging'

-- 设置当前组件日志级别为 ERROR
log:set_level(log.ERROR)

:warning: 注意:

  • 方法名是 set_level(或某些版本为 setLevel),请确认实际 API。
  • 必须在日志输出前调用。
  • 此设置仅对当前组件生效,不影响其他组件写入 app.log

:white_check_mark: 方法三:修改系统默认配置(持久化方案)

若需持久化配置(重启后仍生效),可在系统启动脚本或服务初始化时自动执行 busctl 命令。

示例:添加到 /etc/rc.local 或 systemd 服务中

# 写入启动脚本
echo 'busctl set-property bmc.kepler.LogManager /bmc/kepler/LogManager bmc.kepler.LogManager LogLevel s "error"' >> /etc/rc.local

或创建一个 systemd 服务文件:

# /etc/systemd/system/set-loglevel.service
[Unit]
Description=Set default log level to error
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/usr/bin/busctl set-property bmc.kepler.LogManager /bmc/kepler/LogManager bmc.kepler.LogManager LogLevel s "error"
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

启用服务:

systemctl enable set-loglevel.service

:open_file_folder: 日志输出说明

日志文件 说明
/var/log/app.log 所有 Lua 组件(如 mc.logging)输出的应用日志,默认记录 notice 及以上
/var/log/framework.log Skynet 框架日志,组件启动、生命周期等信息
/dev/shm/log/web/error_log Redfish/Web 接口错误日志

所有通过 mc.logging 输出的日志(包括 notice、warning)都受上述日志级别控制。


:white_check_mark: 验证是否生效

  1. 触发一条 notice 日志(如重启某个组件)

  2. 检查 app.log 是否还有 notice 级别日志:

    grep -i "notice" /var/log/app.log
    

    若无输出,则说明已成功屏蔽。

  3. 检查是否仍有 error 日志:

    grep -i "error" /var/log/app.log
    

    应仍能查看到错误信息。


:cross_mark: 您尝试的方法为何无效

尝试方法 原因
修改 default_logger.set_level(notice) 编译期默认值被运行时配置覆盖
修改位域 level : 4 仅是内存布局定义,不影响逻辑
Lua 中 log:setLevel(ERROR) 失效 可能调用时机过晚,或组件未使用该 logger 实例

:white_check_mark: 总结:推荐操作步骤

  1. 临时测试

    busctl set-property bmc.kepler.LogManager /bmc/kepler/LogManager LogLevel s "error"
    
  2. 持久化配置
    创建 systemd 服务自动设置日志级别。

  3. 验证
    检查 app.log 是否不再出现 noticewarning,但仍有 error


:white_check_mark: 通过 busctl 设置日志级别是 OpenUBMC 官方推荐方式,优先于代码修改,且能全局生效。建议采用此方案实现您的需求。

你直接使用cat /var/log/app.log| grep ERROR或者cat /var/log/app.log| grep -v 'NOTICE|WARN'筛选一下不行吗

想减少写入的信息量,嵌入式空间小擦写次数有限,想尽量减少不必要的日志写入。

1、busctl --user --no-pager list | grep ^bmc.kepler找出所有service
2、busctl --user --no-pager set-property bmc.kepler.XXX /bmc/kepler/hwproxy/MicroComponent bmc.kepler.MicroComponent.Debug SetDlogLevel a{ss}sy 0 error 24这里XXX替换为实际的service名称,可以用脚本遍历设置
这种方式只能设置error级别24小时,不清楚openubmc有没有可以对所有组件设置日志级别的接口

没有解决

无法直接调整整个日志文件的级别,目前只能调整组件的,类似如下操作

~ ~ $ mdbctl

**********************************************************************

                             Debug Shell

                          Copyright(C) 2023

**********************************************************************

% attach bmc_soc
Success

% dloglevel error 24

怎么在代码中更改?

想调整系统级的日志等级只能修改闭源组件代码