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?
'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