解析Erlang日志组件lager的监督树和模块

本文详细解析了Erlang中的日志系统Lager的架构与实现原理,包括控制台及文件后端的具体配置方法,以及如何通过配置不同级别的日志输出来满足系统监控需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


                lager_app

应用行为模式实现

Handlers = [{ lager_console_backend, info},
                { lager_file_backend, [
{"log/error.log", error, 10485760, "", 5},
{"log/console.log", info, 10485760, "", 5}
]}];

函数 expand_handlers,最终要返回{Module, Config}列表。

如果是lager_console_backend,最终会返回,{lager_console_backend, info}

如果是lager_file_backend,最终会返回
        [
            {{lager_file_backend, "log/error.log"},{"log/error.log", error, 10485760, "", 5}} , 
            {{lager_file_backend, "log/console.log"}, {"log/console.log", info, 10485760, "", 5}
        }]



上面列表中的每个,都将调用:supervisor:start_child(lager_handler_watcher_sup, [lager_event, Module, Config]),这会导致生成一个lager_handler_watche进程,并且注册Module事件处理器。



                lager_sup

根监督树

                 lager_handler_watcher

是gen_server的实现,通过add_sup_handler建立和事件处理器的连接;当前进程(gen_server进程)如果终止,事件处理器就会被删除;如果事件处理器被删除,事件管理器会发送消息给当前进程。

gen_event:add_sup_handler(Event, Module, Config) 

如果Module是这种模式 {lager_file_backend, "log/error.log"},后面的ID="log/error.log",就是为了区分事件处理器是同一模块的情况。

                 lager_config

内部引用一个ETS表,名字是lager_config,保存一些配置信息

1、{loglevel, {[2#00001111], []}}      %% 假定日志级别为error  


                 lager_util
1、config_to_levels_int
        如果日志级别为error,那么最终函数会返回 [error, critical, alert, emergency, none]

2、config_to_mask(Conf)
        根据宏定义,DEBUG  128,INFO  64,NOTICE  32,WARNING  16,ERROR  8,
                                CRITICAL  4,ALERT  2,EMERGENCY  1,LOG_NONE  0
        最终这个函数返回掩码 2#0000 1111

                 lager_crash_log

lager crash log记录器。以原生格式,写error_logger错误消息到外部文件中。crash log的配置在lager的元数据文件 lager.app 中。

                 lager_console_backend

控制台后端,gen_event实现。

                 lager_file_backend

文件后端,也是gen_event实现。

转载于:https://my.oschina.net/astute/blog/115579

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值