Ich hatte in einer Anwendung mal folgendes Konzept:
Es gibt verschiedene Fehlerklassen (entspricht bei dir OK, Warnung, Fehler). "Show-Stopper" sind dabei nur echte Fehler. Es gibt eine zentrale Stelle, die nicht nur Fehler, sondern jegliche Art von Statusmeldungen annimmt und zwar hierarchisch. Dazu gab es dann quasi ein Start/Stop-Group, und ein SetStatus für die einzelnen Punkte. Jeder Punkt, der Unterpunkte enthielt, bekam automatisch den "schlechtesten" Status seiner Unterpunkte. Der Logviewer schließlich war dann ein Treeview, in dem man die Punkte anschauen konnte. Alles, wo Fehler aufgetreten waren, war automatisch aufgeklappt (Fehler sind relativ selten aufgetreten). Die positiven Meldungen kann man natürlich auch einfach "wegfiltern", sind aber manchmal ganz angenehm, um zu sehen, wie ein richtig ausgeführter Vorgang ablaufen sollte.
Edit: Was jetzt noch nicht ganz klar aus dem Text wurde, ist folgendes: Wann immer eine Aktion ausgeführt wurde, hat sie ein StartGroup zu Beginn und ein EndGroup am Ende ausgeführt (und in seltenen Fällen noch dazwischen, die Hierarchie ergibt sich meistens aber schon daraus, dass eine Aktion auch andere Aktionen ausführen kann) und hat alle einzelnen Vorgänge geloggt, insbesondere soweit sie entweder länger dauern konnten (damit der Benutzer sie sieht) oder fehlschlagen konnten.
Allerdings gab es da keine Prüfung, ob ein Fehler schonmal gemeldet wurde (die normale Anzeige ist in der Statusbar, im Log sollten ohnehin alle Fehler enthalten sein), und es gab zwar mehrere Threads, aber nicht aus Sicht der
GUI.