2016-04-07 17 views
1

derzeit verwende ich Log4J2 auf WebApps, die auf Tomcat laufen. Jede Webanwendung muss ihre Logs in einen einzelnen Ordner verschieben, der wie der Kontext der Webapps benannt ist.Log4J für jeden Kontext

In der Webapp habe ich einen ServletContextListener implementiert, der bemerkt wird, wenn der Webapp Context bereit ist. Es setzt bei der Pfad zum Systemeigenschaft wie folgt aus:

public void contextInitialized(ServletContextEvent sce) { 
    context = sce.getServletContext().getContextPath(); 
    if(context == null || context.isEmpty()){ 
     context = "ROOT"; 
    } 
    System.setProperty("WebappContext", context); 
    log.info("Context \"" + context + "\" erstellt"); 
} 

Dann benutze ich diese Eigenschaft in log4j2.xml:

<Properties> 
    <Property name="log-path">/srv/tomcat/logs/${sys:WebappContext}</Property> 
</Properties> 
<Appenders> 
    <RollingFile name="rollingLogFile" fileName="${log-path}/out.log" 
       filePattern="${log-path}/out-%d{MMM-dd--HH-mm}.log" > 
    ... 
    </RollingFile> 

Dies funktioniert gut, wenn ich die erste Webapp bereitstellen. Sobald ich jedoch zwei oder mehr Deployments eingerichtet habe, werden alle Protokolle aus allen Kontexten in den neuesten Ordner verschoben, da die Systemeigenschaft für alle Instanzen global ist. Manchmal bekomme ich sogar einen Ordner namens "{sys: WebappContext}", wo einige Logs geschrieben werden.

Was ist der richtige Weg, um den Loggin, den ich will, zu erreichen?

Antwort

1

Versuchen Sie, den Webkontext Lookup anstelle von System Lookup zu verwenden.

Quelle: https://logging.apache.org/log4j/2.0/manual/lookups.html#WebLookup

Die WebLookup ermöglicht es Anwendungen, Variablen abzurufen, die mit dem ServletContext zugeordnet sind. Zusätzlich zu verschiedene Felder im ServletContext abzurufen, unterstützt WebLookup Nachschlagen von Werten, die als Attribute gespeichert sind oder als Initialisierung konfiguriert sind Parameter. Die folgende Tabelle listet verschiedene Schlüssel, die abgerufen werden können:

  • attr.name Gibt das ServletContext Attribut mit der angegebene Name
  • contextPath Der Kontext Weg der Bahn Anwendung
  • effectiveMajorVersion Ruft die Hauptversion der Servlet-Spezifikation, auf der die von diesem ServletContext dargestellte Anwendung basiert.
  • effectiveMinorVersion Ruft die untergeordnete Version der Servlet-Spezifikation ab, die die Anwendung durch diesen ServletContext darstellt.
  • initParam.name Gibt den ServletContext Initialisierungsparameter mit dem angegebenen Namen
  • majorversion Gibt die Hauptversion des Servlet API, dass diese Servlet-Container unterstützt.
  • minorVersion Gibt die untergeordnete Version der Servlet-API zurück, die dieser Servlet-Container unterstützt.
  • rootDir gibt das Ergebnis des Aufrufs von getRealPath mit dem Wert "/" zurück.
  • serverInfo Gibt den Namen und die Version des Servlet-Containers unter zurück, auf dem das Servlet ausgeführt wird.Liefert
  • servletContextName den Namen die Webapplikation, wie in dem Display-name-Elemente des Deployment-Deskriptor definiert

Beispiel

<Appenders> 
    <File name="ApplicationLog" fileName="${web:rootDir}/app.log"/> 
</Appenders> 
+0

'contextPath' hat den Job gemacht, danke! Für zukünftige Leser: Stellen Sie sicher, dass Sie auch die Abhängigkeit log4j-web (Version 2.5 oder höher) haben! – user3774337

1

I verwenden in der Regel nur über einen separaten log4j2.xml für jeden Web App mit

<properties> 
    <property name="LOG_DIR">${sys:catalina.home}/logs/AppName</property> 
</properties> 

Wenn Sie jedoch eine einzige log4j2.xml, folgen möchten ng alan7678 Rat sollten Sie in der Lage sein hinzufügen

<context-param> 
    <param-name>applicationName</param-name> 
    <param-value>AccountService</param-value> 
</context-param> 

web.xml und verwenden Sie dann

<properties> 
    <property name="LOG_DIR">${sys:catalina.home}/logs/${web:applicationName}</property> 
</properties> 

Allerdings habe ich das selbst nicht ausprobiert.