【发布时间】:2017-09-27 11:27:24
【问题描述】:
我在 Wildfly 10.1 应用服务器上的 war 应用程序的 log4j2 配置有一些问题。 我有以下 log4j2.xml 文件(位于 WEB-INF 目录中):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Properties>
<Property name="logDir">${sys:jboss.server.log.dir}</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<RollingRandomAccessFile
name="FileLogger"
fileName="${logDir}/${sys:loggerFileName}.log"
filePattern="${logDir}/$${date:yyyy-MM}/${sys:loggerFileName}-%d{yyyy-MM-dd}-%i.log.zip">
<PatternLayout pattern="%d{HH:mm:ss,SSS} %-5level [%t] %logger{36} - %msg%n"/>
<Policies>
<OnStartupTriggeringPolicy />
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="128MB" />
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${logDir}" maxDepth="2">
<IfFileName glob="*/${sys:loggerFileName}-*.log.zip" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="FileLogger"/>
</Root>
</Loggers>
我想在 Wildfly 上部署这个应用程序的几个实例。每个都有自己的部署名称和运行时名称,如下面的屏幕截图所示
部署应用程序后,我会像这样替换“loggerFileName”属性的值:
@WebListener
public class ServletContextInitializer implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent contextEvent) {
String loggerFileName = getLoggerFileNameForContext(servletContext);
System.setProperty("loggerFileName", loggerFileName);
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
ctx.reconfigure();
}
@Override
public void contextDestroyed(ServletContextEvent contextEvent) {
}
private String getLoggerFileNameForContext(ServletContext servletContext) {
String contextPath = servletContext.getContextPath();
return removeNonAlphaNumericCharsFromString(contextPath);
}
private String removeNonAlphaNumericCharsFromString(String input) {
return input.replaceAll("[^A-Za-z0-9 ]", "");
}
}
如果应用程序一个接一个地部署,则日志文件会正确创建。但是,当我停止 Wildfly 然后删除日志,然后在某些情况下启动 Wildfly 时,根本不会为其中一个实例创建日志文件。
有人可以建议我有什么问题吗? System.setProperty() 是否被所有应用程序实例共享。
提前感谢您的帮助。
【问题讨论】: