Question relating to trace/debug/log OTP features

Reto Kramer kramer@REDACTED
Wed Dec 10 08:21:11 CET 2003

I'm puzzled by the many facilities OTP contains to generate trace-, 
debug- and log information. Perhaps someone could point me to an 
overview/tutorial of what the mechanisms are that you recommend I use 
for a brand new development.  What's missing the most in the docs (or I 
could not find it) is how the various mechanisms relate to each other 
(e.g. which ones are basic services that high level trace/log services 
leverage, which ones are "old" and still there for backwards 

Specifically I need 3 things:
1. error/warning/info/detail messages that the end user should see in 
2. debug information.
3. more debug information (free form, not tied to gen_* 

For (1) I use error_logger currently, is there an alternative I should 
consider?  Sometimes I'd like to be able to show customers more levels 
of granularity (currently error and info are available, I need warning 
and detail as well) without having to resort to the debug level data in 
(2) and (3).  Is there a way to add another level to the current 2 
(error/info/...)?  Is there an Erlang/OTP philosophy to only having 2 
For (2)  I use sys:trace(Mod,true) to enable *DBG* messages for gen_* 
behaviour and for my own (along section 6.2.1 "Special processes" of 
the "design principles" doc). However sometimes I'd like to show 
additional *DBG* messages of my own in callback modules that I pass to 
gen_* behaviour - how can I do that (i.e. what do I call inside the 
callback module to generate a *DBG* event?
For (3) I currently use a macro to enable/disable io:format calls (the 
old style "recompile with debug" story). Is there a facility in OTP 
that I can use to enable dumping of debug information at runtime w/o 
recompiling (I'm quite happy to accept the performance penalty, my 
application is not performance critical)? E.g. can  I use sys:trace in 
arbitrary code and through that get the dynamic enable/disable?

In addition, does anyone have examples code or tutorial on the 
following (or advice as to when to use):
- disk_log and disk_log_wrapper (i.e. vs. the error_logger info/error 
- seq_trace and the observer/ttb (R9C). Specifically are seq_trace and 
ttb the basis and observer the visualizer? How do I invoke the observer 
(R9C docs are silent on that)?
- How does et (et_collector, selector, viewer) relate to the 
observer/ttb/seq_trace facilities?  How does it relate to sys:trace?

I'm hoping that some OTP expert can help me understand these facilities 
and their relation and when to use what (ideally by 
example/experience).  Perhaps someone could talk about the OTP history 
and how the many powerful mechanisms were motivated (various projects, 
timing, ...)

Thanks in advance for helping me navigate the Zoo.
- Reto
A distributed system is a system in which I can't do my work because 
some computer has failed that I've never even heared of . -- Leslie 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: text/enriched
Size: 3064 bytes
Desc: not available
URL: <>

More information about the erlang-questions mailing list