lager trace file的流程和实现分析

tracing是跟踪的意思,在lager中指的是跟踪用户打印的日志,根据属性做日志消息的重定向,如果没有tracing,那么lager没法做到按模块打印日志。

调用 lager:trace_file("logs/trace.log", [{module, myModule}], error),表明 myModule 模块中的日志打印语句,级别在error之上的日志,都会被保存到文件trace.log中。

第一个参数是文件名;第二个参数是filter过滤器,可以包括自定义属性;第三个是拦截的日志级别。

内部,tracing 的实现利用了整体的监督树结构,每一个trace file都对应一个lager_event处理器,都对应一个lager_event_watcher子进程

下面分析 lager:trace_file("logs/trace.log", [{vhost, "example.com"}], error) 调用的完整流程和实现细节

入口:trace_file(File, Filter, Level)

1、生成元组,{Filter, Level, {lager_file_backend, File}}
2、调用 lager_util:validate_trace 验证生成的元组,主要是验证filter,返回 {Filter, LevelMask, {lager_file_backend, File}},LevelMask是level的掩模
3、验证事件处理器{lager_file_backend,"logs/trace.log"}是否存在;lager_event区分事件处理器,特别是同一个回调模块的多个处理器,是通过{lager_file_backend, ID},ID使用文件名
4、如果不存在,则添加事件处理器
5、并且,添加 Trace={Filter, LevelMask, {lager_file_backend, File}} 到 ets 表 lager_config中;key 是 loglevel,value是 {MinLevel, [Trace|Traces]},MinLevel是所有事件处理器最小的日志级别的掩模

你可能感兴趣的:(erlang,File,tracing,trace,lager)