2016-01-28 34 views
1

我想弄清楚如何添加一個appender到一個依賴於java系統屬性是給定/設置的記錄器。如何根據java系統屬性有條件地添加log4j2 appender?

所以我們可以說我有一個這樣的基本配置:

<Logger name="myLogger" level="info" additivity="false"> 
    <AppenderRef ref="myAppender1" /> 
    <AppenderRef ref="myAppender2" /> 
</Logger> 

所以現在我想找出一個辦法,如果我提供一個參數-PaddAppender2有條件只會增加第二個附加目的地。類似這樣的:

<Logger name="myLogger" level="info" additivity="false"> 
    <AppenderRef ref="myAppender1" /> 
    <?if (${sys:enableAppender2:-false) == "true"}> 
    <AppenderRef ref="myAppender2" /> 
    </?if> 
</Logger> 

我該怎麼做?

我知道我可以例如做出一個屬性(「日誌級別」)這樣的(其中,「信息」是默認的,如果沒有給出該屬性)水平動態:

<Logger name="test" level="${sys:logLevel:-info}" additivity="false"> 

我看着在documentation for filters,我無法弄清楚。當然,如果過濾器甚至是正確的方式去這裏。

回答

0

我無法單獨通過配置文件找出解決方案,但我找到了一個能夠以編程方式解決問題的解決方案。請注意,在我們的特定情況下,我們總是登錄到「本地日誌」(「本地日誌」),但在給定情況下(由屬性控制),我們還希望將相同的信息記錄到另一個位置這是不相對的),並定期讀取並轉發到分段服務器(「splunk forwarder」)。

這就是爲什麼我們可以將大部分屬性從一個記錄器複製到另一個記錄器。

private static final Logger SPLUNK_LOG = getLogger(); 

private static Logger getLogger() { 
    if (!BooleanUtils.toBoolean(SystemUtils.getJavaPropertyValue(ENABLE_PROPERTY_NAME, "false"))) { 
     return LoggerFactory.getLogger(SPLUNK_LOG_NAME); 
    } else { 
     LOG.info("Dynamically adding splunk forwarder appender"); 
     try { 
      final LoggerContext loggerContext = (LoggerContext) LogManager.getContext(); 
      final Configuration configuration = loggerContext.getConfiguration(); 

      // configure appender based on local splunk appender 
      final RollingFileAppender splunkLocal = (RollingFileAppender) configuration.getAppender(LOCAL_LOG_NAME); 
      final RollingFileAppender splunkForwarder = RollingFileAppender.createAppender(FORWARDER_FILE_NAME, 
        FORWARDER_FILE_PATTERN, FORWARDER_APPEND, FORWARDER_NAME, null, null, null, 
        splunkLocal.getManager().getTriggeringPolicy(), splunkLocal.getManager().getRolloverStrategy(), 
        splunkLocal.getLayout(), splunkLocal.getFilter(), null, FORWARDER_ADVERTISE, null, null); 
      splunkForwarder.start(); 

      // add splunk forwarder appender to splunk logger 
      final LoggerConfig loggerConfig = configuration.getLoggerConfig(SPLUNK_LOG_NAME); 
      loggerConfig.addAppender(splunkForwarder, Level.INFO, null); 

      LOG.info("Successfully added splunk forwarder appender"); 
      return loggerContext.getLogger(SPLUNK_LOG_NAME); 
     } catch (Exception ex) { 
      throw new IllegalStateException("Failed to dynamically add splunk forwarder appender", ex); 
     } 
    } 
} 

如果有人知道如何通過配置文件做到這一點,那就太好了。

0

這是打算處理的方式是通過使用過濾器。在這種情況下,您可以使用腳本過濾器。

<Logger name="myLogger" level="info" additivity="false"> 
    <AppenderRef ref="myAppender1" /> 
    <AppenderRef ref="myAppender2"> 
    <ScriptFilter onMatch="ACCEPT" onMisMatch="DENY"> 
     <Script language="groovy"><![CDATA[ 
     return System.getProperty("enableAppender2", "false").equalsIgnoreCase("true"); 
     ]]></Script> 
    </ScriptFilter> 
    </AppenderRef> 
</Logger> 
0

類似rgoers解決辦法,但使用代替。該解決方案受益於Nashorn引擎是 Java 8的一部分,因此不需要額外的依賴關係。

<Scripts> 
    <Script name="isAppender2Enabled" language="nashorn"><![CDATA[ 
    var System = Java.type('java.lang.System'), 
     Boolean = Java.type('java.lang.Boolean'); 
    Boolean.parseBoolean(System.getProperty('enableAppender2', 'false')); 
    ]]></Script> 
</Scripts> 

<Loggers> 
    <Logger name="myLogger" level="info" additivity="false"> 
    <AppenderRef ref="myAppender1" /> 
    <AppenderRef ref="myAppender2"> 
     <ScriptFilter onMatch="ACCEPT" onMisMatch="DENY"> 
     <ScriptRef ref="isAppender2Enabled" /> 
     </ScriptFilter> 
    </AppenderRef> 
    </Logger> 
</Loggers> 

請注意,ScriptFilter每次發生Log4j事件時都會對腳本進行評估。因此,可以在運行時啓用/禁用appender(通過更改系統屬性的值)並立即生效。另一方面,腳本評估可能會對測井性能產生負面影響。

相關問題