erlang lager trace配置

时间:2014-04-19 17:22:49

标签: logging erlang

我遇到了大量跟踪功能的问题 我需要的是:

5个文件:
1. crash.log - 这是默认的lager文件,让它为
2. error.log - 这里将是所有错误及以上
3. info.log - 这里将包含所有信息,通知和警告信息 4和5。 transmit.log received.log - 此处将显示使用lager:info([{type, tx}]lager:error([{type, rx}]及跟踪功能的各种严重性的特殊邮件。
过滤到这些文件的邮件不应在info.log和error.log

中重复

到目前为止我取得的成就:
消息成功重定向到传输和接收的日志文件,error.log按预期工作。

问题:
1.不知道如何使info.log只接受通知,信息和警告,没有调试级别(使用{level, '<error'}也将包括调试级别)
2.重定向到transmit.log和received.log文件的消息也出现在info.log和error.log文件中。 F.E.如果我使用lager:error([{type, tx}], "ERROR")它会出现3次:在info.log,error.log和transmit.log中,它应该只出现在transmit.log中

我的lager配置:

{lager, [
  {crash_log, 'logs/crash.log'}
  ,{handlers, [
    {lager_file_backend, [{file, "logs/info.log"}, {level, info}]}
    ,{lager_file_backend, [{file, "logs/error.log"}, {level, error}]}
    ,{lager_file_backend, [{file, "logs/received.log"}, {level, none}, {date, "$D0"},
      {formatter_config, [date, " ", time," [",severity,"] ", pid, " ", message, "\n"]}]}
    ,{lager_file_backend, [{file, "logs/transmitted.log"}, {level, none}, {date, "$D0"},
      {formatter_config, [date, " ", time," [",severity,"] ", pid, " ", message, "\n"]}]}
  ]}
  ,{traces, [
    {{lager_file_backend, "logs/received.log"}, [{type, rx}], info}
   ,{{lager_file_backend, "logs/transmitted.log"}, [{type, tx}], info}
  ]}
]}

1 个答案:

答案 0 :(得分:1)

对于问题1,请查看大啤酒的源文件lager_util.erl

levels() ->
    [debug, info, notice, warning, error, critical, alert, emergency, none].

level_to_num(debug)     -> ?DEBUG;
level_to_num(info)      -> ?INFO;
level_to_num(notice)    -> ?NOTICE;
level_to_num(warning)   -> ?WARNING;
level_to_num(error)     -> ?ERROR;
level_to_num(critical)  -> ?CRITICAL;
level_to_num(alert)     -> ?ALERT;
level_to_num(emergency) -> ?EMERGENCY;
level_to_num(none)      -> ?LOG_NONE.

DEBUG是最低级别,如果您只需要记录以上注意,只需设置为{level,notice}。

对于第二个问题,有两种方法。 我认为你可以通过增加一个新的后端来解决它。在lager的源代码中,lager_file_backend.erl

handle_event({log, Message},
    #state{name=Name, level=L,formatter=Formatter,formatter_config=FormatConfig} = State) ->
    case lager_util:is_loggable(Message,L,{lager_file_backend, Name}) of
        true ->
            {ok,write(State, lager_msg:timestamp(Message), lager_msg:severity_as_int(Message), Formatter:format(Message,FormatConfig)) };
        false ->
            {ok, State}
    end;

您可以基于lager_file_backend创建一个新的后端,并在此处添加逻辑以解决问题。

方法2.不要修改更大的源代码,并使用unix的bash和grep工具来解决问题。