Instrument your application with tracing and get tree-structured summaries of your application activity with timing information on the console:
server{host="localhost", port=8080} 0ms INFO starting 300ms INFO listening conn{peer_addr="82.9.9.9", port=42381} 0ms DEBUG connected 300ms DEBUG message received, length=2 conn{peer_addr="8.8.8.8", port=18230} 300ms DEBUG connected conn{peer_addr="82.9.9.9", port=42381} 600ms WARN weak encryption requested, algo="xor" 901ms DEBUG response sent, length=8 901ms DEBUG disconnected conn{peer_addr="8.8.8.8", port=18230} 600ms DEBUG message received, length=5 901ms DEBUG response sent, length=8 901ms DEBUG disconnected 1502ms WARN internal error 1502ms INFO exit
(Format inspired by slog-term)
After instrumenting your app with tracing, add this subscriber like this:
let subscriber = Registry::default().with(HierarchicalLayer::new(2));
tracing::subscriber::set_global_default(subscriber).unwrap();