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 traces37.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).