Není to úplně na 100% to, na co se ptáš, ale já používám Log4delphi.
To je Delphi implementace slavného log4java a používaveného i v dotnet jako log4net.
Funguje to tak, že máš nějaký globálně přístupný objekt logger, tomu nadefinuješ způsob logování neboli Appender (do souboru, do databáze, na konzoli) a úroveň logování (TRACE, DEBUG, INFO, ERROR, FATAL) a formát záznamu (čas, hláška, výjimka, název loggeru). Těch appenderů můžeš mít víc. Můžeš třeba do souboru logovat vše a zároveň (jen) chyby posílat mailem.
Ve svém programu pak máš cosi jako:
gLogger.Info('Vstup Vypocet() s '+IntToStr(a)+' a '+IntToStr(b));
...
gLogger.Info('Vystup Vypocet() s hodnotou '+IntToStr(vraceno));
Existují odpovídající volání Debug(), Trace(), Info(), Error(), Fatal().
A v logu máš:
25 9 2011 20:54:05:378 [INFO] ROOT: Vstup Vypocet() s 5 a 2
25 9 2011 20:54:06:812 [INFO] ROOT: Vystup Vypocet() s 7
Takže řekněme, že máš try/except a v něm volání Error().
Pokud zákazníkovi nastane chyba, tak je zalogovana. Míra informací je dána nastavenou úrovní a jak moc sis to doplnil do metod. A záleží na tobě, jak si to obsloužíš. Můžeš mít v aplikaci "Hlášení chyby" kam se to přiloží, nebo se to odešle samo,...
V Delphi s tím zkušenost z praxe zatím nemám, v Javě to fungovalo na řízení výroby 24x7. Když jsi se na tu mašinu vzdáleně přilogoval a pustil jsi si náhled toho logu,
tak ti tam v reálném čase skákalo co dotyčný dělá, na jaké zakázce, jakým momentem utahuje šrouby, jaké díly naskenoval a přiřadil do výrobku, vše obaleno informacemi o metodách a objektech které to realizovaly.
Tam (v Javě) to také mělo více možností, umělo to zapisovat do systémových logů, posílat emailem, komunikovat webovými službami. Tady by se to muselo dopsat, ale nebyl by to velký problém.
Samozřejmě si to sežere nějaký výkon v rámci aplikace.