lager是erlang的日志库,源代码位于https://github.com/Erlang-lager/lager中,支持多个日志接收器,并且可以通过配置控制节点在大量日志输出时的处理虽然大多数使用情况都可以通过参考官方文档中对每个配置参数的解释来处理,但是配置某些参数可能不会生效。 在这种情况下,必须结合源代码来理解每个参数。
一、总体框架lager主要使用gen_event,可以有多个回调模块。 当调用gen_event:notify时,将调用所有回调模块。 总体框架如下图所示。
二、配置2.1同步异步从2.0版开始,gen_event采用混合方法。 轮询邮箱的大小,并根据邮箱的大小在同步和异步之间切换。
{ async_threshold_window,5 },
{ async_threshold_window,20 }
邮箱超过20个使用同步,当邮箱下降到20-5=15时使用异步
在lager_backend_throttle.erl中,与此部分对应的代码如下:
handle_event(log,_Message} ),State ) ) message_queue_len,len )=Erlang 3360 process _ info (self ),len State#state.async} of {true,_,true} - %% need to flip to sync mode? TOGGLE_SYNC (,lager_config:set ) state#state.sink,async} )、false )、ok、state#state ) async=false {_ TOGGLE_ASYNC (,lager_config:set ) state#state.sink,async} )、true )、ok、state#state ) async=true _ te 2 .限制每秒的日志量{error_logger_hwm,50}
理想情况下,设置此参数应该将每秒日志量限制为50,但实际使用时,此参数仅限于进程crash时出现的错误日志,而普通的error或info日志则不受限制这是因为error和info日志的handle是lager_file_backend,因此必须配置high_water_ttdlq参数才能限制每秒的日志量。
{high_water_ttdlq,50}
初始化handle时,取出high_water_ttdlq这个构成的值并放入Shaper的hwm区域,下次日志到达时,handle会检查hwm
只有当此字段有价值时,日志才会受到限制,通常与参数flush_queue一起配置。
可以控制每秒日志量的配置参考:
{lager_file_backend,[{file,'error.log'},{level,error},{count,5},{size,10485760},
三.为什么lager.erl中没有info (。 error ) )等接口,如lager:info ) )去调用lager的接口,但打开lager.erl却找不到对应的接口实现。 当使用parse transform生成目标二进制文件以获得调用行号时,编译器将调用lager _ transform 3360 parse _ transform/2以获取代码的abstract code
文件的编译指定了{parse_transform,lager_transform}