【问题标题】:Log4j2 configuration for multiply instance web applications多实例 Web 应用程序的 Log4j2 配置
【发布时间】: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() 是否被所有应用程序实例共享。

提前感谢您的帮助。

【问题讨论】:

    标签: web instance war log4j2


    【解决方案1】:

    您可以在 .yaml 或 .properties 文件中将 instanceName 设置为 config,并在 log4j2.propeties 中使用它。

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      相关资源
      最近更新 更多