Lager日志行被截断

时间:2014-04-26 01:40:07

标签: logging erlang lager

我正在修改一些ejabberd代码,并且我遇到了通过lager打印的错误:

2014-04-25 18:29:39.380 [error] emulator Error in process <0.652.0> on node 'ejabberd@localhost' with exit value: {function_clause,[{lists,zip,[[transport,connection,pid,method,version,peer,host,host_info,port,path,path_info,qs,qs_vals,bindings,headers,p_headers,cookies,meta,body_state,multipart,buffer,resp_compress...

不幸的是,该行被截断,我无法看到堆栈跟踪的其余部分。如何查看整个错误消息?

2 个答案:

答案 0 :(得分:4)

我认为较大的大小可以按如下方式调整: 在lager.erl源文件

%% @doc Manually log a message into lager without using the parse transform.
-spec log(log_level(), pid() | atom() | [tuple(),...], list()) -> ok | {error, lager_not_running}.
log(Level, Pid, Message) when is_pid(Pid); is_atom(Pid) ->
    dispatch_log(Level, [{pid,Pid}], Message, [], ?DEFAULT_TRUNCATION);
log(Level, Metadata, Message) when is_list(Metadata) ->
    dispatch_log(Level, Metadata, Message, [], ?DEFAULT_TRUNCATION).

%% @doc Manually log a message into lager without using the parse transform.
-spec log(log_level(), pid() | atom() | [tuple(),...], string(), list()) -> ok | {error, lager_not_running}.
log(Level, Pid, Format, Args) when is_pid(Pid); is_atom(Pid) ->
    dispatch_log(Level, [{pid,Pid}], Format, Args, ?DEFAULT_TRUNCATION);
log(Level, Metadata, Format, Args) when is_list(Metadata) ->
    dispatch_log(Level, Metadata, Format, Args, ?DEFAULT_TRUNCATION).

?DEFAULT_TRUNCATION在lager.hrl文件中定义。

-define(DEFAULT_TRUNCATION, 4096).
-define(DEFAULT_TRACER, lager_default_tracer).

我认为您可以增加上述默认值,然后再次编译贮藏器以供使用。

但是您的日志不会像4096那样长,并且日志不是来自lager,而是来自lager的重定向(error_logger)。以下问题可能与您的问题有关: Truncated error report in erlang

答案 1 :(得分:2)

有两种可能性。第一种是将以下编译选项添加到rebar / erlang.mk中的erlc选项:

+'{lager_truncation_size, 20480}'

这将为erlc编译的所有模块设置总日志的最大允许大小为20kb,如果您不处理制作make文件,则可能是项目中的所有模块。截断限制的原因是不要使较大的进程过载,因此在整个项目中执行此操作可能会很危险。

请注意,使用-compile属性在每个模块的基础上添加此功能,请参阅this issue

另一种方法是自己调用lager:dispatch_log,并绕过转换:

lager:dispatch_log(info, [{pid, self()}], "hello ~s|", [lists:duplicate(1000, "hello")], 20480).

这两种方法都要求您对代码或构建过程进行修改。

相关问题