Wie Sie sich mit TÖDLICHEM Ausgang (oder alle benutzerdefinierten log-level) mit SLF4J und Log4j2
Ich habe diese spezifischen Anforderungen :
- Müssen in der Lage sein, um log-in FATAL Ebene
- Verwenden müssen SLF4J
- Verwenden müssen Log4j2
Recht, hier ist nun mein Umsetzung:
final Logger logger = LoggerFactory.getLogger(HelloWorld.class);
final Marker marker = MarkerFactory.getMarker("FATAL");
logger.error(marker, "!!! Fatal World !!!");
Hier mein PatternLayout (in yaml):
PatternLayout:
Pattern: "%d{ISO8601_BASIC} %-5level %marker [%t] %logger{3.} - %msg%n"
Hier mein log-Ausgabe :
20150506T155705,158 ERROR FATAL [main] - !!! Fatal World !!!
Haben Sie eine Idee haben über, wie man effizient zu entfernen, die "FEHLER" aus der log-Ausgabe?
Vielen Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Marker
ist nicht wirklich das, was Sie hier wollen.Marker
ist für die "Bereicherung" log-Nachrichten, so dass Sie mehr leicht durchsuchbar. Sie versuchen, ändern Sie den log-level/Priorität, die ein wenig anders ist.Bist du mit
logger.error()
dem melden der Nachricht alsERROR
Ebene.Wenn es keine
FATAL
level pre-definiert (in der Regel gibt es, wielogger.fatal()
), dann verwenden Sie die generischelogger.log()
festlegen können, um den log-level.ODER
UPDATE:
Aus der SLF4J Homepage:
http://www.slf4j.org/faq.html#fatal
So, mit SLF4J, es ist nicht möglich, ein
FATAL
log-level. Ich Stimme überhaupt nicht mit der Logik hinter dieser Entscheidung, aber es ist was es ist.FATAL
Ebene ist "redundant", obwohl ich stark widersprechen. slf4j.org/faq.html#fatalHier ist die nächste funktionierende Lösung kam ich mit einigen Kollegen :
Hier ist die Java Beispiel :
Hier ist die YAML Beispiel :
Ich weiß, die Frage ist für log4j. Ich fand diese Seite, wenn Sie suchen, in Bezug auf logback. Hier ist, was sl4j empfiehlt: https://www.slf4j.org/faq.html#fatal.
Hier ist was ich getan habe, für log4j, die ich auch empfehlen für log4j2....
Schreiben Sie Ihre eigenen benutzerdefinierten slf4j statische binder aka Brücke. Dies erfordert ein wenig Arbeit, aber es lohnt, sich für eine Vielzahl von komplizierten Gründen 1, dass ich das blog über einen Tag.
Hier ist, was Sie tun.
Log4jLogger
Klasse, und ändern Sie die marker-Methoden (trace,error,warn,info, etc) zum Versand angemessen. ieif (marker.contains("FATAL")) fatal(....);
log4j-slf4j-impl
von Ihrem Projekt und verwenden Sie Ihren neuen code.<soap-box-rant>
Ich denke ehrlich gesagt, dass slf4j ist stark fehlerhaft, weil
logger.fatal(...)
.fatal
fehlt. Es ist nicht 80/20. Marker sind für die 1% undfatal
ist für die 99%.</soap-box-rant>
1 einer von Ihnen in der Lage, tatsächlich Teil der boot-Prozess Ihre logging-framework, im Gegensatz zu hart, zu bestimmen, fast beliebige statische Initialisierung
Die einzige Lösung, die ich bisher gefunden habe, ist die Verwendung von 5-Marker :
Und melden Sie übergeben die marker jedesmal :
Und ändern Sie die PatternLayout völlig zu entfernen, die LogLevel und immer melden sich die Marker, wie zum Beispiel :
Ich glaube, diese Lösung ist ein hack... würde Es auch entfernen, das log-level auf einer externen Bibliothek, die mit der LogLevel der richtige Weg.
Zusammenfassung : Diese Lösung ist keine gute Lösung.
UPDATE : ich habe versucht, eine andere Lösung ist das schreiben eines RewritePolicy :
Scheint es keine Möglichkeit zum ändern der LogLevel einer LogEvent in Log4j2 (die Sinn machen).
Zusammenfassung : immer Noch keine Lösung.
Könnte man hinzufügen, "FATAL" am Anfang deiner Nachricht. Zum Beispiel:
Verzichten Sie auf einige Dinge, wie die Filterung basierend auf der Ebene, aber das kann ok sein für viele Menschen, vor allem, da Sie wahrscheinlich nicht herausfiltern FATALEN Aussagen (debug und trace, sicher).