You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Erlang的lager中配置模块级日志级别及默认规则?

解决Lager默认日志级别与模块单独配置的问题

嘿,我来帮你搞定这个Lager日志配置的需求!你想要全局默认用info级别,同时能按需调整特定模块的日志级别,之前找到的代码不工作,大概率是配置方式或者细节没做对,我给你一步步讲正确的实现方法:

一、先搞定全局默认Info级别

首先在你的应用配置文件(比如sys.config或者项目的config/sys.config)里,给Lager做基础配置,把全局默认日志级别设为info

[{lager, [
    % 配置控制台日志后端,默认级别设为info
    {handlers, [
        {lager_console_backend, [
            info, 
            {lager_default_formatter, [time, " [", severity, "] ", message, "\n"]}
        ]}
    ]},
    % 可选:配置文件日志后端,同样默认info级别
    {handlers, [
        {lager_file_backend, [
            {file, "log/app.log"},
            {level, info},
            {formatter, lager_default_formatter},
            {formatter_config, [time, " [", severity, "] ", message, "\n"]}
        ]}
    ]},
    % 其他基础配置(可选)
    {error_logger_redirect, true},
    {crash_log, "log/crash.log"},
    {log_root, "log"}
]}].

这里的核心是在每个日志后端(控制台、文件)的配置里把默认级别设为info,这样所有没单独配置的模块都会继承这个级别。

二、单独调整特定模块的日志级别

有两种方式:启动时静态配置,或者运行时动态调整,按需选择就行。

1. 静态配置(启动时生效)

在Lager的配置里加上modules字段,指定特定模块的级别,它会覆盖全局默认值:

[{lager, [
    % 上面的handlers等基础配置...
    {modules, [
        {my_critical_module, debug},   % 把这个模块调到debug级别,输出更多日志
        {noisy_third_party_lib, warning} % 把第三方库调到warning,减少冗余日志
    ]}
]}].

注意模块名必须是原子类型(比如my_critical_module,不能加引号写成字符串),否则配置不会生效。

2. 动态调整(运行时修改)

如果需要在应用运行过程中临时调整级别,直接用Lager提供的API就行:

% 把my_critical_module的控制台日志级别调到debug
lager:set_loglevel(lager_console_backend, my_critical_module, debug).

% 把noisy_third_party_lib的文件日志级别调到warning
lager:set_loglevel(lager_file_backend, noisy_third_party_lib, warning).

% 查看某个模块当前的日志级别
lager:get_loglevel(lager_console_backend, my_critical_module).

这里要注意指定正确的日志后端(比如lager_console_backend是控制台,lager_file_backend是文件),如果要给所有后端都调整,可以先获取所有后端列表再循环设置:

[lager:set_loglevel(Backend, my_critical_module, debug) || Backend <- lager:list_backends()].

三、为什么你之前的代码不工作?

大概率是这几个常见坑:

  • 配置位置错误:你可能把模块级别配置写到了错误的地方,必须放在Lager的应用配置下,不能单独写在其他地方
  • 模块名格式错误:模块名必须是原子,不能用字符串,比如{my_module, debug}正确,{"my_module", debug}错误
  • 后端指定错误:动态调整时没指定对应的日志后端,导致设置没生效
  • 版本兼容问题:不同版本的Lager配置格式有差异,比如旧版本可能用lager_handlers而不是handlers,建议核对你使用的Lager版本的官方文档

四、验证配置是否生效

写个简单的测试代码验证一下:

% 在默认模块里打印日志
lager:info("默认模块的info日志,应该能看到"),
lager:debug("默认模块的debug日志,默认看不到"),

% 在配置了debug的模块里打印
lager:debug("配置了debug的模块的debug日志,应该能看到"),
lager:warning("这个warning日志不管什么级别都能看到")

启动应用后查看日志输出,就能确认配置是否符合预期了。

内容的提问来源于stack exchange,提问作者Robert Simmons Jr.

火山引擎 最新活动