Log4j2 отключить консоль на производстве - PullRequest
0 голосов
/ 20 ноября 2018

Я занимаюсь разработкой веб-приложения и использую log4j2.В режиме разработки я использую RollingFile и консольные приложения.

Все работает правильно, но я бы хотел отключить приложение Console, когда мой проект будет выпущен и будет находиться в рабочем режиме.Вот фрагмент моего кода log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="PropertiesConfig" packages="com.project.application">

    <!-- PROPERTIES -->
    <Properties>
        <Property name="webName">Project</Property> 
        <Property name="logBaseDir">${sys:catalina.base}/logs/</Property>
        <Property name="consolePattern">%highlight{[%-5level] [%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c{1}] - %msg%n}</Property>
        <Property name="rollingFilePattern">[%-5level] [%d{yyyy-MM-dd HH:mm:ss,SSS}] [%c{1}] - %msg%n</Property>
    </Properties>

    <!-- APPENDERS -->
    <Appenders>
        <!-- Console -->
        <Console name="Console" 
                 target="SYSTEM_OUT"
                 immediateFlush="true">
            <PatternLayout>
                <pattern>${consolePattern}</pattern>
            </PatternLayout>
        </Console>

        <!-- RollingFile -->
        <RollingFile name="RollingFile" 
                     fileName="${sys:logBaseDir}${webName}/${webName}.log"
                     filePattern="${sys:logBaseDir}${webName}.%d{yyyy-MM-dd}.log"
                     immediateFlush="true">
            <PatternLayout>
                <pattern>${rollingFilePattern}</pattern>
            </PatternLayout>
            <Policies>
                <OnStartupTriggeringPolicy />
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>

    <!-- LOGGERS -->
    <Loggers>
        <Logger name="com.project.application" additivity="true" level="warn">
            <AppenderRef ref="RollingFile" />
        </Logger>

        <Root level="info"> <!-- @TODO disable in production -->
            <AppenderRef ref="Console" />                
        </Root>
    </Loggers>

</Configuration> 

Спасибо!

1 Ответ

0 голосов
/ 20 ноября 2018

Используйте фильтр , например ThreadContextMapFilter:

<Console name="Console" target="SYSTEM_OUT" immediateFlush="true">
  <ThreadContextMapFilter onMatch="DENY" onMismatch="NEUTRAL">
    <KeyValuePair key="is-production" value="1"/><!-- skip on production -->
  </ThreadContextMapFilter>
  <PatternLayout>
    <pattern>${consolePattern}</pattern>
  </PatternLayout>
</Console>

Инициализация записи ThreadContext может быть выполнена в ServletContextListener, например:

@WebListener
public class Log4jThreadContextInitializer implements ServletContextListener {

  @Override
  public void contextInitialized(ServletContextEvent sce) {
    String isProduction = isProduction() ? "1" : "0";
    sce.getServletContext().log("Setting 'is-production' flag for Log4j to " + isProduction);
    org.apache.logging.log4j.ThreadContext.put("is-production", isProduction);
  }

  private boolean isProduction() {
    // TODO: production detection
  }

  @Override
  public void contextDestroyed(ServletContextEvent sce) {
  }
}
...