2  SASL 错误日志

2 SASL 错误日志

注意

本节中描述的 SASL 错误日志概念自 Erlang/OTP 21.0 起已弃用,当时引入了新的 日志记录 API

新的默认行为是 SASL 应用程序不再影响记录哪些日志事件。 监管者报告崩溃报告 通过内核设置的默认日志记录处理程序进行记录。 进度报告 默认情况下不记录,但可以通过将主要日志级别设置为 info 来启用,例如通过使用内核配置参数 logger_level

可以通过将内核配置参数 logger_sasl_compatible 设置为 true 来重新启用旧的 SASL 错误日志记录行为。

本节中描述的 多文件错误报告日志记录 机制也保留用于向后兼容。但是,新的日志记录 API 还引入了 logger_disk_log_h(3),它是一个日志记录处理程序,可以使用 disk_log(3) 打印到多个文件。

SASL 应用程序引入了三种类型的报告

  • 监管者报告
  • 进度报告
  • 崩溃报告

SASL 应用程序启动时,它会添加一个日志记录处理程序,该处理程序会按照 SASL 配置参数 中指定的格式和写入这些报告。

当受监管的子进程意外终止时,会发出监管者报告。监管者报告包含以下项目

报告监管者的名称。

指示子进程从监管者的角度来看在哪个阶段终止。这可能是 start_errorchild_terminatedshutdown_error

终止原因。

子进程的启动规范。

当监管者启动或重新启动子进程时,会发出进度报告。进度报告包含以下项目

报告监管者的名称。

成功启动子进程的启动规范。

使用函数 proc_lib:spawnproc_lib:spawn_link 启动的进程都包装在 catch 中。当这样的进程以意外原因终止时,会发出崩溃报告,任何原因都属于 normalshutdown{shutdown,Term} 之外的任何原因。使用行为 gen_servergen_fsmgen_statem 的进程就是此类进程的示例。崩溃报告包含以下项目

有关崩溃进程的信息,例如初始函数调用、退出原因和消息队列。

有关与崩溃进程链接且不捕获退出的进程的信息。这些进程是由于该进程崩溃而终止的邻居。收集的信息与上一项中描述的“崩溃者”信息相同。

以下示例显示了当进程崩溃时生成的报告。示例进程是受 test_sup 监管者监管的 permanent 进程。执行除以零操作,错误首先由有故障的进程报告。生成崩溃报告,因为该进程是使用函数 proc_lib:spawn/3 启动的。监管者会生成监管者报告,显示崩溃的进程。当进程最终重启时,会生成进度报告。

        =ERROR REPORT==== 27-May-1996::13:38:56 ===
        <0.63.0>: Divide by zero !
        
        =CRASH REPORT==== 27-May-1996::13:38:56 ===
        crasher:
        pid: <0.63.0>
        registered_name: []
        error_info: {badarith,{test,s,[]}}
        initial_call: {test,s,[]}
        ancestors: [test_sup,<0.46.0>]
        messages: []
        links: [<0.47.0>]
        dictionary: []
        trap_exit: false
        status: running
        heap_size: 128
        stack_size: 128
        reductions: 348
        neighbours:
        
        =SUPERVISOR REPORT==== 27-May-1996::13:38:56 ===
        Supervisor: {local,test_sup}
        Context:    child_terminated
        Reason:     {badarith,{test,s,[]}}
        Offender:   [{pid,<0.63.0>},
        {name,test},
        {mfa,{test,t,[]}},
        {restart_type,permanent},
        {shutdown,200},
        {child_type,worker}]
        
        =PROGRESS REPORT==== 27-May-1996::13:38:56 ===
        Supervisor: {local,test_sup}
        Started:  [{pid,<0.64.0>},
        {name,test},
        {mfa,{test,t,[]}},
        {restart_type,permanent},
        {shutdown,200},
        {child_type,worker}]

多文件错误报告日志用于存储 error_logger 收到的错误消息。错误消息存储在多个文件中,每个文件的大小都小于指定的千字节数。同时存在的文件数量不超过指定数量。日志记录速度非常快,因为每个错误消息都被写为二进制项。

有关更多详细信息,请参阅参考手册中的 sasl(6) 应用程序。

报告浏览器用于浏览和格式化由 STDLIB 中定义的错误日志记录处理程序 log_mf_h 写入的错误报告。

log_mf_h 处理程序会将所有报告写入报告日志记录目录,该目录在配置 SASL 应用程序时指定。

如果报告浏览器离线使用,则可以将报告复制到启动浏览器时指定的另一个目录。如果没有指定这样的目录,浏览器将从 SASL error_logger_mf_dir 读取报告。

使用函数 rb:start([Options]) 启动 rb_server,如以下示例所示

        5> rb:start([{max, 20}]).
        rb: reading report...done.
        rb: reading report...done.
        rb: reading report...done.
        rb: reading report...done.
        {ok,<0.199.0>}

输入命令 rb:help() 访问报告浏览器的在线帮助系统。

使用函数 rb:list() 列出所有加载的报告

        4> rb:list().
        No                Type          Process       Date     Time
        ==                ====          =======       ====     ====
        20            progress         <0.17.0> 1996-10-16 16:14:54
        19            progress         <0.14.0> 1996-10-16 16:14:55
        18               error         <0.15.0> 1996-10-16 16:15:02
        17            progress         <0.14.0> 1996-10-16 16:15:06
        16            progress         <0.38.0> 1996-10-16 16:15:12
        15            progress         <0.17.0> 1996-10-16 16:16:14
        14            progress         <0.17.0> 1996-10-16 16:16:14
        13            progress         <0.17.0> 1996-10-16 16:16:14
        12            progress         <0.14.0> 1996-10-16 16:16:14
        11               error         <0.17.0> 1996-10-16 16:16:21
        10               error         <0.17.0> 1996-10-16 16:16:21
        9        crash_report  release_handler 1996-10-16 16:16:21
        8   supervisor_report         <0.17.0> 1996-10-16 16:16:21
        7            progress         <0.17.0> 1996-10-16 16:16:21
        6            progress         <0.17.0> 1996-10-16 16:16:36
        5            progress         <0.17.0> 1996-10-16 16:16:36
        4            progress         <0.17.0> 1996-10-16 16:16:36
        3            progress         <0.14.0> 1996-10-16 16:16:36
        2               error         <0.15.0> 1996-10-16 16:17:04
        1            progress         <0.14.0> 1996-10-16 16:17:09
        ok

使用函数 rb:show(Number) 显示特定报告的详细信息

7> rb:show(4).
        
PROGRESS REPORT  <0.20.0>                                   1996-10-16 16:16:36
===============================================================================
supervisor                                                     {local,sasl_sup}
started
[{pid,<0.24.0>},
{name,release_handler},
{mfa,{release_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
        
ok
8> rb:show(9).
        
CRASH REPORT  <0.24.0>                                      1996-10-16 16:16:21
===============================================================================
Crashing process                                                               
pid                                                                 <0.24.0>
registered_name                                              release_handler
error_info                             {undef,{release_handler,mbj_func,[]}}
initial_call
{gen,init_it,
[gen_server,
<0.20.0>,
<0.20.0>,
{erlang,register},
release_handler,
release_handler,
[],
[]]}
ancestors                                                [sasl_sup,<0.18.0>]
messages                                                                  []
links                                                    [<0.23.0>,<0.20.0>]
dictionary                                                                []
trap_exit                                                              false
status                                                               running
heap_size                                                                610
stack_size                                                               142
reductions                                                                54

ok

可以显示包含通用模式的所有报告。假设一个进程崩溃是因为它尝试调用一个不存在的函数 release_handler:mbj_func/1。然后可以按如下方式显示报告

12> rb:grep("mbj_func").
Found match in report number 11
        
ERROR REPORT  <0.24.0>                                      1996-10-16 16:16:21
===============================================================================
        
** undefined function: release_handler:mbj_func[] **
Found match in report number 10

ERROR REPORT  <0.24.0>                                      1996-10-16 16:16:21
===============================================================================
        
** Generic server release_handler terminating 
** Last message in was {unpack_release,hej}
** When Server state == {state,[],
"/home/dup/otp2/otp_beam_sunos5_p1g_7",
[{release,
"OTP  APN 181 01",
"P1G",
undefined,
[],
permanent}],
undefined}
** Reason for termination == 
** {undef,{release_handler,mbj_func,[]}}
Found match in report number 9
        
CRASH REPORT  <0.24.0>                                      1996-10-16 16:16:21
===============================================================================
Crashing process                                                               
pid                                                                 <0.24.0>
registered_name                                              release_handler
error_info                             {undef,{release_handler,mbj_func,[]}}
initial_call
{gen,init_it,
[gen_server,
<0.20.0>,
<0.20.0>,
{erlang,register},
release_handler,
release_handler,
[],
[]]}
ancestors                                                [sasl_sup,<0.18.0>]
messages                                                                  []
links                                                    [<0.23.0>,<0.20.0>]
dictionary                                                                []
trap_exit                                                              false
status                                                               running
heap_size                                                                610
stack_size                                                               142
reductions                                                                54
        
Found match in report number 8
        
SUPERVISOR REPORT  <0.20.0>                                 1996-10-16 16:16:21
===============================================================================
Reporting supervisor                                           {local,sasl_sup}
        
Child process                                                                  
errorContext                                                child_terminated
reason                                 {undef,{release_handler,mbj_func,[]}}
pid                                                                 <0.24.0>
name                                                         release_handler
start_function                               {release_handler,start_link,[]}
restart_type                                                       permanent
shutdown                                                                2000
child_type                                                            worker
        
ok

使用函数 rb:stop() 停止 rb_server

13> rb:stop().
ok