2016-01-28 36 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(通过更改系统属性的值)并立即生效。另一方面,脚本评估可能会对测井性能产生负面影响。

相关问题