Ich war an einem Projekt, wo ich brauchte Dutzende von Web-Anwendungen zu verwalten. Jede der Apps protokollierte etwas anders und es war ein großer Fehler, sie zu verwalten. Ich habe eine Strategie verwendet, die der von Ihnen beschriebenen ähnlich ist, um sie auf log4j zu standardisieren, und es hat sich sehr gut bewährt.
Grundsätzlich habe ich eine einzige common.jar erstellt, die gemeinsamen Code enthält. Diese JAR-Datei enthält eine Datei log4j.xml, die die Protokollebene auf INFO setzt und den Standard-Appender auf stdout für common.jar setzt. Diese log4j-Konfiguration wird als Basis für alle anderen Apps verwendet.
Für dieses Beispiel diese Klasse vorgeben ist innen common.jar:
public class ThirdPartyLib
{
protected static final Logger log = LogManager.getLogger("third-party-lib");
public void doSomething()
{
log.debug("Third Party App is about to Do something!");
log.info("Third Party App just did something");
}
}
nun alle anderen Web-Anwendungen einfach auf common.jar verlassen können. Zum Beispiel so tun, als diese Klasse in myapp.war ist:
public class MyApp
{
public void CallThirdParty()
{
ThirdPartyLib lib = new ThirdPartyLib();
lib.doSomething();
}
}
Seit log4j.xml innerhalb common.jar ist, wird dieser Code so etwas wie dies loggt sein. Mit anderen Worten, es gibt keine Notwendigkeit log4j.xml innerhalb myapp.war zu setzen:
2011-01-03 15:49:22,451 [main] INFO third-party-lib - Third Party App just did something
Nun, wenn Sie wollen/müssen, um die Protokollierung in myapp.war zu steuern, dann einfach eine log4j.xml innen myapp.war platzieren und überschreiben Einstellungen von common.jar. Zum Beispiel könnten Sie die Ebene DEBUG, eingestellt und dann werden Sie sehen:
2011-01-03 16:03:22,928 [main] DEBUG third-party-lib - Third Party App is about to Do something!
2011-01-03 16:03:22,928 [main] INFO third-party-lib - Third Party App just did something
UPDATE - Ist es möglich, jede Webapp zu konfigurieren, um separate Datei zu protokollieren?
Ja, definitiv. Beispielsweise können Sie Protokolle an einen RollingFileAppender anstelle von stdout in log4j.xml für myapp.war leiten. Dies ist praktisch, da Sie dann jedes einzelne Webapp-Protokoll in einer eigenen separaten Datei speichern können.
Zusätzlich habe ich einen Servlet-Filter geschrieben (ähnlich dem, was gigadot vorgeschlagen hat), der log4j konfiguriert, um zu prüfen, ob eine log4j.xml auf einem externen Pfad existiert (außerhalb jedes Webapps). Auf diese Weise sind die log4j.xml-Dateien auch außerhalb der Kriege zugänglich und wir können Protokollebenen einstellen, ohne den Servlet-Container neu zu starten (in diesem Fall Tomcat). Wenn die externe Datei log4j.xml nicht vorhanden ist, verwendet sie standardmäßig die Datei log4j.xml für jeden Klassenpfad der Anwendung.
Dies ist in der Linie von dem, was ich dachte, um die Angelegenheit noch komplizierter zu machen, hat jede Web-App einen Appender, der auf einer anderen Datei basierend auf der Webapp protokolliert. Wenn ich meine individuellen Projektkonfigurationen auf genau diese Informationen reduziere, überschreibt oder ersetzt sie die Konfiguration von der ThirdPartyLib? – Casey
Hey Casey, alle Konfigurationen innerhalb von log4j.xml in jeder einzelnen App überschreiben das Zeug in log4j.xml innerhalb der common.jar. Das Hinzufügen eines Dateiappenders in Log4j.xml jeder Anwendung sollte also gut funktionieren. Ich habe meine Antwort mit weiteren Informationen aktualisiert. Hoffe, das hilft, viel Glück! – Upgradingdave
Danke, auch der Hinweis darüber, sie außerhalb der Kriege zu speichern, finde ich interessant, da ich auf dieses Problem gestoßen bin, etwas in der Produktion debuggen muss, aber das Protokolllevel nicht verlassen möchte, um Fehler zu beheben usw. Jemand in unserem Team zu haben eine einzelne Datei zu aktualisieren wäre großartig. – Casey