Multithread-sichere Protokollierung
Wir haben eine Anwendung, die läuft in mehreren threads und Verwendungen, von Log4Net als logging-framework. Stießen wir auf ein Szenario, wo einige log-Ereignisse nicht protokolliert. Wie bereits in den docs, die FileAppender und die anderen Appenders sind "nicht bei multithreadoperationen sicher".
Ich suchte im Internet nach Lösungen oder Appenders, konnte Sie aber nicht finden.
Kennen Sie eine multithread-sichere Log4Net Appender verwendet einen ring-Puffer oder eine Warteschlange zu stellen multithread-Unterstützung? Oder sollten wir eine andere multithread sicher logging framework überhaupt?
Vielen Dank im Voraus!
- Duplikat von stackoverflow.com/questions/1294668 - im Grunde, log4net verwenden Sie den appender angemessen für Sie.
- Danke für die Antwort. Ich schrieb einige unit-tests, die bestätigen, dass die Log4Net multithread-Sicherheit (siehe Antwort unten).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schrieb ich einige Unit-tests, das problem zu reproduzieren: Ein test schafft 50 threads, und jeder thread-Protokolle 500 Nachrichten. Danach werden die geschriebenen Zeilen wurden gezählt und als Ergebnis bekam ich, von 25.000 (50 x 500) Zeilen in einer anderen Reihenfolge. Getestet habe ich es auf einem dual-core und auf einem acht-core-Maschine.
Getestet habe ich einen statischen Logger:
und mit einem Logger für jede Instanz der test-Klasse /thread:
Und alle tests waren grün.
So Log4Net funktioniert einwandfrei und Griffe multithreading-Szenarien gut. Der Appender docs aktualisiert werden soll und geben an, dass Multithread-Operationen werden unterstützt, wenn die Logger-API verwendet wird, in der richtigen Weise.
Ich denke das problem mit den fehlenden log-Einträgen, denen wir begegneten auf dem Rechner eines Kunden ist, verursacht durch andere Probleme. Vielleicht sind die zugrunde liegenden VM oder hardware defekt ist.
Vielen Dank für Ihre Hilfe!
Habe ich noch nie genutzt FileAppender und kann nicht sagen, ob es threadsicher ist, aber ich hatte noch nie irgendwelche Probleme mit RollingFileAppender. Die docs Zustand, dass Angehörige der Art sind nicht thread-sicher, aber das sollte OK sein, es sei denn, Sie versuchen, direkt zu schreiben, um den appender. Sie nicht brauchen, um Ihre eigenen sperren code um Aufrufe wie:
Dass die tests grün sind, bedeutet nicht, dass die Linien tatsächlich in die Datei geschrieben, aber dass dort war keine Ausnahme. Oder hast du den check liest die Datei, die Sie in Ihrem test als gut? Ich hatte das gleiche problem nachdem ich umgestellt auf web-Gärten in IIS. An diesem Punkt, dass nur ein thread war, schreiben von Zeilen in die Datei.
Mehr über mehrere threads und log4net hier: hier und hier
Den Log4Net ist thread-sicher, aber der appenders verwendet werden kann, ein problem. Die file-appenders tun "block", wenn Sie aufgerufen. Dies bedeutet, dass in Ihrer Anwendung und jedes Protokoll geschickt, um Log4Net hat, um jedes appenders vor der Rückkehr in Ihre Anwendung.
Es ist thread-sicher, viele threads nutzen können, Log4Net-log-Nachrichten, aber wo Log4Net heißt die Anwendung wartet, bis die appenders zu vervollständigen. Der Zeitpunkt der Ausführung der Protokollierung Hinzugefügt, um Ihre Anwendung Zeit.
Dies ist leicht bewiesen. Siehe: https://www.codeproject.com/Tips/1219696/Log-Net-Singleton-Wrapper-for-Concurrent-Logging
Was ich gemacht habe, ist "wrap" das Log4Net-Funktionen in eine statische singleton-das ist thread-sicher und setzen Sie dann jede log-Meldung in die Warteschlange laufen in einer gleichzeitig ausgeführten Threads. Das machen alle, die Protokollierung, parallel zur Anwendung, sondern die Ausführung der Anwendung nicht warten, bis die appenders zu vervollständigen.