Gibs Sprachfeatures fuers Logging?
-
Ich hab mir einen Logger selbst gebaut... Der kritische Pfad ist saukurz, es ist garantiert, dass keine Daten verloren gehen...
Der Sendevorgang besteht aus einer Zeile...
-
tntnet schrieb:
#define log_define(clazz) inline static Logger& getLogger() \ { static Logger logger = 0; \ if (logger == 0) \ logger = Logger.createLogger(clazz); \ return logger; } #define log_debug(expr) if ( logger.getLevel() > Level.DEBUG ) { \ logger.getOStream() << expr; } #define log_info(expr) if ( logger.getLevel() > Level.INFO ) { \ logger.getOStream() << expr; } #define log_warn(expr) if ( logger.getLevel() > Level.WARN ) { \ logger.getOStream() << expr; } #define log_error(expr) if ( logger.getLevel() > Level.ERROR ) { \ logger.getOStream() << expr; }Das ist ja der Horror-Trip und der wichtigste Grund wieso man den Preprozessor rauswerden und begraben sollte. Mach doch gleich die Loger-Klasse als Define-Macro rein
.rüdiger schrieb:
Warum sollte man daraus ein Sprachfeature machen? Das passt doch gut in eine Funktion oder in ein Macro.
Wer lesen kann (naja...)
Devent schrieb:
Zum einen koennte man dann den Preprozessor weglassen (und damit sich etliche Nachteile ersparen) und der Compiler koennte einen dabei auch unterstuetzen. Auch koennte der Compiler Loging automatisieren (zum Beispiel bei Exceptions, bei ein/austritten aus/in Methoden oder beim Speichermanagment).
Naja wird ein Traum bleiben, Loging zu automatisieren und zu standardisieren.

-
Artchi schrieb:
Helium schrieb:
Ich hab doch keinen Bock meine Anwendung neu zu übersetzen.
Wieso nicht? Übersetzt du immer im Release?
Und selbst wenn: was kostet es dich denn? Mußt du irgendwie auf einem Fahrrad sitzen und den Stromgenerator für den Build-Prozess in Gang setzen? Bei mir geht eigentlich alles automatisch...Du stellst dir das komisch vor. Versetz dich mal in die Lage eines Entwicklers, der dein Produkt benutzt. Dieser muss also, wenn er ein höheres Logging Level haben will, dein Produkt neu übersetzen. Bevor ich das tun würde, hätte ich mir a) eine Alternative gesucht oder b) mir eine Alternative entwickelt, denn deine Vorstellung von Logging-Konfiguration ist in jeder Hinsicht geradezu weltfremd.
-
es gibt ja auch zwei arten von log-meldungen: die für die debug-version und die für den kunden.
aber für beides braucht man keine sprachfeatures wie devent sie vorschlägt.
-
Man kann mit den Makros sehr leicht das Logging so konfigurieren, dass es im Build gar nicht (mehr) auftaucht, oder man den Log-Level zur Laufzeit beliebig einstellen kann.
Verstehe gar nicht warum sich hier so viele am Präprozessor aufhängen, es gibt nunmal kein Sprachfeature, folglich muss man einen anderen Weg gehen der möglich ist.Und dass ein Präprozessor sinnvoll ist zeigen ja Präprozessoren für andere Sprachen, die geschrieben wurden, weil diese Sprachen, im Gegensatz zu C oder C++, eben keinen besitzen.
-
lolz schrieb:
Und dass ein Präprozessor sinnvoll ist zeigen ja Präprozessoren für andere Sprachen, die geschrieben wurden, weil diese Sprachen, im Gegensatz zu C oder C++, eben keinen besitzen.
Antithese: Die wurden von frustrierten C- oder C++-Programmierern geschrieben, weil diese damit arbeiten mussten und nicht umdenken wollten.
-
wenn du automatisiertes logging betreiben willst, kannst du dir ja mal AOP anschauen, da setzt du einfach deine pointcuts vor und nach die methoden und kannst darin deine übergebenen argumente und objektzustände protokollieren ohne großen extra code aufwand zu haben.
an die leute, die hier behauptet haben logging sei nur in test und debug versionen sinnvoll aber nicht in fertigen release versionen haben wohl noch nie größere software produziert, oder? oder verratet mir mal wie ihr in ner großen webapplikation mal nen fehler finden wollt ohne ausführliche logs. die software neu kompilieren? und neu deployen? und den server am besten neustarten? im produktivbetrieb? :))
-
DrGreenthumb schrieb:
es gibt ja auch zwei arten von log-meldungen: die für die debug-version und die für den kunden.
aber für beides braucht man keine sprachfeatures wie devent sie vorschlägt.Sprachfeatures braucht man gar nicht, man kann auch alles in Asm schreiben. Ich bin aber faul (deswegen bin ich auch programmierer und mag PC-Techniken) und ein Fan von Standards und Automatismen.
@DEvent schrieb:
wenn du automatisiertes logging betreiben willst, kannst du dir ja mal AOP anschauen, da setzt du einfach deine pointcuts vor und nach die methoden und kannst darin deine übergebenen argumente und objektzustände protokollieren ohne großen extra code aufwand zu haben.
AOP habe ich ganz vergessen. Gibts AOP fuer Java? Oder in welcher Sprache wird den AOP eingesetzt?
lolz schrieb:
Und dass ein Präprozessor sinnvoll ist zeigen ja Präprozessoren für andere Sprachen, die geschrieben wurden, weil diese Sprachen, im Gegensatz zu C oder C++, eben keinen besitzen.
Das Präprozessor nuetzlich ist bestreitet ja keiner, nur wurde PP nicht dafuer konzepiert und sollte auch dafuer nicht eingesetzt werden.
Btw, wurde mal nicht gesagt das die existens des PP ein Anzeichen dafuer ist, dass die Sprache fehlende Features hat? Wenn man den PP so oft benutzt um ein Loging zu erleichtern, sollte man sich vielleicht doch ueberlegen, dass man das doch in die Sprache direkt intergriert?
-
DEvent schrieb:
DrGreenthumb schrieb:
es gibt ja auch zwei arten von log-meldungen: die für die debug-version und die für den kunden.
aber für beides braucht man keine sprachfeatures wie devent sie vorschlägt.Sprachfeatures braucht man gar nicht, man kann auch alles in Asm schreiben. Ich bin aber faul (deswegen bin ich auch programmierer und mag PC-Techniken) und ein Fan von Standards und Automatismen.
sag doch mal bitte konkret was du von einer Sprache fürs Logging erwartest ausser dass du ein @ vor die Funktion schreiben darfst.
[
Btw, wurde mal nicht gesagt das die existens des PP ein Anzeichen dafuer ist, dass die Sprache fehlende Features hat? Wenn man den PP so oft benutzt um ein Loging zu erleichtern, sollte man sich vielleicht doch ueberlegen, dass man das doch in die Sprache direkt intergriert?In C++ braucht man den PP nur wenn man die Zeilennummer ausgeben möchte oder bei release-builds das Logging ausstellen möchte.
Und in jeder anderen Sprache nimmt man halt den leeren Funktionsaufruf in Kauf und man bricht sich auch kein Bein.
-
DEvent schrieb:
tntnet schrieb:
#define log_define(clazz) inline static Logger& getLogger() \ { static Logger logger = 0; \ if (logger == 0) \ logger = Logger.createLogger(clazz); \ return logger; } #define log_debug(expr) if ( logger.getLevel() > Level.DEBUG ) { \ logger.getOStream() << expr; } #define log_info(expr) if ( logger.getLevel() > Level.INFO ) { \ logger.getOStream() << expr; } #define log_warn(expr) if ( logger.getLevel() > Level.WARN ) { \ logger.getOStream() << expr; } #define log_error(expr) if ( logger.getLevel() > Level.ERROR ) { \ logger.getOStream() << expr; }Das ist ja der Horror-Trip und der wichtigste Grund wieso man den Preprozessor rauswerden und begraben sollte. Mach doch gleich die Loger-Klasse als Define-Macro rein
.Nö, der Preproc ist gut. Man muss ihn nur richtig verwenden. Aber das gilt im Grunde für alles.
DEvent schrieb:
rüdiger schrieb:
Warum sollte man daraus ein Sprachfeature machen? Das passt doch gut in eine Funktion oder in ein Macro.
Wer lesen kann (naja...)
Vielleicht kann ich wirklich nicht lesen, aber ich habe keine Begründung gefunden, warum Logging ein Sprachfeature sein sollte.