Wie SLF4J Loggers in einer JSP verwenden
Frage
Ich bin in dem Prozess des das Protokollieren von einer mittelgroßen Anwendung aus einer benutzerdefinierten Lösung, um etwas mehr Standard zu migrieren. Ich habe über die Verwendung Logback und SLF4J entschieden, und ich habe erfolgreich den größten Teil der Java-Code migriert. Allerdings habe ich ziemlich viel von JSPs, die einfach System.out für die Protokollierung verwenden. Ich habe noch nie gearbeitet viel mit JSPs und begann sich zu fragen: wie kann ich die richtige Protokollierung in einer JSP
verwenden soll<%@page import="org.slf4j.Logger"%>
<%@page import="org.slf4j.LoggerFactory"%>
<%
Logger log = LoggerFactory.getLogger(getClass());
%>
<!-- ... -->
<%
log.info("Hello Logging!");
%>
Dies ist, was zuerst Sinn kam, aber es scheint falsch in mehreren Punkten:
- Art und Weise zu ausführlich, und eine Menge Arbeit braucht, um die bestehenden JSPs zu konvertieren
- ein Anruf wird auf LoggerFactory.getLogger () jedes Mal, wenn die Seite (im Gegensatz zu einem statischen
logger
Feld in einer Standard-Java-Klasse) gemacht wird, - Ich denke, der Name des Loggers auch etwas nicht wirklich einfach so sein wird
Gibt es irgendeine Art von Standard oder eine bewährte Methode, oder irgendetwas für die Protokollierung in JSPs?
Auch IIRC, es war eine Art von taglib für Log4J. Gibt es etwas ähnliches für SLF4J (oder vielleicht Logback)?
Lösung
Hier finden Sie aktuelle slf4j-taglib .
Andere Tipps
Sie könnten versuchen, (man beachte die "!")
<%! org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("JSPname"); %>
Dann ersetzen Sie System.out die mit
<% log.info("Hello Logging!"); %>
Boris Kommentar sollte allerdings wirklich in concideration genommen werden, sollte JSPs nicht Protokollierung im Allgemeinen benötigen. Ich würde nur diese Technik verwenden (oder etwas ähnlich) bestehende Protokollierung zu ersetzen, die gehalten werden mußten.
public enum MyLoggerFactory {
INSTANCE;
@SuppressWarnings("unchecked")
private final Map<Class, Logger> loggers = new HashMap<Class, Logger>();
@SuppressWarnings("unchecked")
public Logger getLogger(Class clazz) {
if (loggers.get(clazz) == null) {
loggers.put(clazz, LoggerFactory.getLogger(clazz));
}
return loggers.get(clazz);
}
}
Dann ist Ihre JSP-Seite könnte wie folgt aussehen:
<%
MyLoggerFactory.INSTANCE.getLogger(getClass()).info("Hello Logging!");
%>
Um Logger in der JSP-Datei, initialisieren Sie das Logger-Objekt in der folgenden Art und Weise verwendet werden:
<% Logger logger = LoggerFactory.getLogger(this.getClass()); %>
Und dann könnte man gehen Sie vor, indem Sie
logger.info(); or logger.error();, etc.
Ich denke, es ist eine schlechte Praxis ist von withing die gegenständliche Schicht einer Anwendung auslösen anzumelden. Im Allgemeinen würde ich in der Business-Logik zu erwarten darf nur die Anmeldung - eine JSP vollgestopft mit Logging-Aufruf würde sicherlich die Trennung von Bedenken bricht Prinzip
.Als temporäres, dennoch elegantes Problem zu umgehen, können Sie versuchen, einen benutzerdefinierten Tag lib erstellen.