如何在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.




