Logging, Tracing & Debugging

Levels: emergency, alert, critical, error, warning, notice, info, debug.

37.1 logger (OTP 21+)

Levels: emergency, alert, critical, error, warning, notice, info, debug. Handlers, filters, formatters configurable in sys.config.

-include_lib("kernel/include/logger.hrl").

?LOG_INFO("User ~p logged in", [UserId]),
?LOG_ERROR(#{what => db_failure, reason => Reason}),   % structured reports
logger:warning("disk at ~p%", [92]),
logger:set_primary_config(level, debug),
logger:set_process_metadata(#{request_id => Id}),
logger:add_handler(file_h, logger_std_h, #{config => #{file => "log/app.log"}}).

37.2 Debugging tools

GUI: processes, apps, ETS, load charts, tracing terminal version of observer (production-friendly) graphical step debugger (compile with debug_info) int:i(mod) / int:break(mod, Line) sys:trace/2, sys:get_state/1 inspect OTP processes analyse erl_crash.dump top-like process view

37.3 Tracing with dbg

recon_trace (from the recon library) adds rate-limited, production-safe tracing:

Other tracing: erlang:trace/3, seq_trace (follow message chains), ttb (distributed trace tool), the trace module sessions (OTP 27+), tprof/eprof/fprof/cprof profilers.

dbg:tracer(),
dbg:p(all, c),                                   % trace calls in all processes
dbg:tpl(kv_store, handle_call, '_', []),         % trace local + exported calls
dbg:tpl(kv_store, '_', [{'_', [], [{return_trace}]}]),   % include return values
dbg:stop().
recon_trace:calls({kv_store, handle_call, '_'}, 10).    % at most 10 traces

37.4 recon toolkit

recon:proc_count(memory, 5),            % top 5 processes by memory
recon:proc_window(reductions, 5, 1000), % top CPU users over 1s
recon:bin_leak(5),                      % find binary leaks
recon:info(Pid),
recon:get_state(Pid).