4.6.3. 日志跟踪¶
基本用法¶
lager:trace_file("log/error.log", [{module, mymodule}], warning)
// 下面两命令相同
lager:trace_console([{request, 117}])
lager:trace_console([{request, 117}], debug)
% 查看跟踪状态
lager:status()
% 清除全部跟踪
lager:clear_all_traces().
% 删除指定trace
{ok, Trace} = lager:trace_file("log/error.log", [{module, mymodule}]),
...
lager:stop_trace(Trace)
% 进程跟踪用字符串
lager:trace_console([{pid, "<0.410.0>"}])
Filter composition:
% all means "AND style"
lager:trace_console([{all, [{request, '>', 117}, {request, '<', 120}]}])
% any has the effect of "OR style"
lager:trace_console([{any, [{request, '>', 117}, {request, '<', 120}]}])
Null filters:
{null, false}: 像黑洞, 任何都通不过
{null, true}: 所有都能通过
自定义跟踪¶
根据log message attributes可以实现日志跟踪,lager自动对pid, module, function and line这4个attributes进行日志跟踪。但你也可以按自己期望增加。
如:
lager:warning([{request, RequestID},{vhost, Vhost}], "Permission denied to ~s", [User]).
你就可以通过下面的方法进行跟踪:
lager:trace_file("logs/example.com.error", [{vhost, "example.com"}], error).
在进程的生命周期中保留元数据:
lager:md([{zone, forbidden}]).
% lager:md will only accept a list of key/value pairs keyed by atoms.
Multiple sink support¶
默认sink为lager_event,但可以指定其他sink为,如:
% 指定sink为audit_event
lager:trace_file("log/security.log", [
{sink, audit_event},
{function, myfunction}
], warning)
有下面2个未解决问题:
Traces cannot intercept messages sent to a different sink.
解决:opening multiple traces
使用lager:trace_file打开的文件,不能再被其他sink的trace_file写
解决:rearchitecting lager's file backend, but this has not been tackled.
Traces from configuration¶
实例:
{lager, [
{handlers, [...]},
{traces, [
%% handler, filter, message level (defaults to debug if not given)
{lager_console_backend, [{module, foo}], info },
{{lager_file_backend, "trace.log"}, [{request, '>', 120}], error},
{{lager_file_backend, "event.log"}, [{module, bar}] } %% implied debug level here
]}
]}.