2017-10-12 57 views
1

在Log4J2中,是否有一種簡單方法可以在開發中登錄到控制檯? 我想在配置中擁有appender,只有當我在我的開發環境中時(例如可以通過System屬性找到)。LogJ2:僅在開發中登錄到控制檯

在logback中,我有一個可選的包括將控制檯appender添加到根記錄器的包含,所以它非常方便,並且根本沒有侵入性。 Log4J2中有類似的東西嗎?

感謝

回答

-1

,你可以:

  1. 從配置中刪除所有的ConsoleLogger和編程方式添加它(見下面的例子) - 無法刪除它編程
  2. 負載權配置手動讀取正確的文件
  3. 通過system property加載正確的配置文件
  4. 如果使用行家可以以編程吃午飯

實施例1之前的文件重命名:

final LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false); 
    final Configuration loggerContextConfiguration = loggerContext.getConfiguration(); 
    final Layout layout = PatternLayout.createDefaultLayout(); 
    final Appender appender = ConsoleAppender.createDefaultAppenderForLayout(layout); 
    appender.start(); 
    loggerContextConfiguration.addAppender(appender); 
    loggerContextConfiguration.getLoggers().values().forEach(l -> l.addAppender(appender, Level.DEBUG, null)); 
    loggerContext.updateLoggers(); 

實施例2:

Configurator.initialize(null, "./resources/log4j2-dev.xml"); 
+0

以編程方式更改配置將涉及編寫基於log4j2實現的代碼,而不是僅依賴公共API,應儘可能避免。 –

+0

是的,這是#2變體解決方案 –

0

一種解決方案是與ConsoleAppender和任何沿配置RoutingAppenderFileAppender like RollingFileAppender

下面是RoutingAppender樣本log4j2.xml配置文件 -

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE Configuration> 

<Configuration status="warn" name="xml_configuration"> 

    <Properties> 
     <Property name="basePath">./log/</Property> 
    </Properties> 

    <Appenders> 
     <RollingFile name="fileLogger" fileName="${basePath}app.log" 
      filePattern="${basePath}app_%d{yyyyMMdd}.log.gz"> 

      <PatternLayout 
       pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%c] [%M] [%l] - %msg%n" /> 

      <Policies> 
       <TimeBasedTriggeringPolicy interval="1" 
        modulate="true" /> 
      </Policies> 
     </RollingFile> 


     <Console name="consoleLogger" target="SYSTEM_OUT"> 
      <PatternLayout 
       pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%c] [%M] [%l] - %msg%n" /> 
     </Console> 

     <Routing name="RoutingLogger"> 
      <!-- Condition is - if isDevEnv VM argument is true (-isDevEnv=true), 
       then log messages in console else log messages in file --> 
      <Script name="RoutingCondition" language="JavaScript"><![CDATA[ 
       var imports = new JavaImporter(java.lang); 
       with (imports) { 
        System.getProperty("isDevEnv") == "true" ? "console" : "file"; 
       }]]> 
      </Script> 
      <Routes> 
       <Route ref="consoleLogger" key="console" /> 
       <Route ref="fileLogger" key="file" /> 
      </Routes> 
     </Routing> 

    </Appenders> 

    <Loggers> 
     <Logger name="mypackage" level="info" additivity="false"> 
      <appender-ref ref="RoutingLogger" /> 
     </Logger> 
     <Root level="error" additivity="false"> 
      <appender-ref ref="RoutingLogger" /> 
     </Root> 
    </Loggers> 
</Configuration> 

日誌的路由將基於對isDevEnv VM argument值來完成。如果isDevEnv VM argumenttrue-DisDevEnv=true),則在控制檯中記錄消息,否則在文件中記錄消息。

因此,在您的開發環境中,您可以將此VM argument設置爲true值以啓用在控制檯中的日誌記錄。對於生產環境,無需設置此VM argument