Этого можно добиться, используя прослушиватель контекста для настройки системного свойства, а затем использовать это свойство в конфигурации log4j.
Шаг 1: настроить системное свойство
Сначала вы можете установить системное свойство (например, contextPath
) в значение пути контекста Tomcat приложения. Вы можете сделать это в контексте слушателя.
package my.package.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
@Override
public void contextInitialized(ServletContextEvent event) {
defineContextPath(event);
}
private void defineContextPath(ServletContextEvent event) {
ServletContext context = event.getServletContext();
String contextPath = context.getContextPath();
if (contextPath != null) {
String pattern = ".*/(.*)";
String contex = contextPath.replaceAll(pattern, "$1");
System.setProperty("contextPath", contex);
System.out.println("contextPath: " + contex);
} else {
System.out.println("contextPath not found");
}
}
}
Объявите слушателя в вашем web.xml:
<!-- Be sure to keep my.package.ContextListener as the first listener
if you have more listeners as below -->
<listener>
<listener-class>my.package.ContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Шаг 2: используйте системное свойство, чтобы установить имя файла log4j
Затем в файле конфигурации log4j вы можете использовать системное свойство contextPath
, чтобы задать имя файла log4j.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%d %5p %c{1}:%L - %m%n" />
</Console>
<RollingFile name="RollingFile" fileName="${catalina.base}/logs/${tomcat.hostname}/${contextPath}.log"
filePattern="${catalina.base}/logs/${tomcat.hostname}/$${date:yyyy-MM}/${contextPath}-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n" />
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="500 MB" />
</RollingFile>
</Appenders>
<Loggers>
<Logger name="org.apache.log4j.xml" level="info" />
<Root level="info">
<AppenderRef ref="STDOUT" />
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
Ссылки
https://blog.oio.de/2013/06/10/using-the-context-path-of-a-web-app-as-log-filename-with-log4j/