【问题标题】:How to programatically access appenders from logback-access config?如何以编程方式从 logback-access 配置访问附加程序?
【发布时间】:2019-02-25 17:39:50
【问题描述】:

我使用 LogbackValve 为 Tomcat 7.0 启用了 logback-access 日志。 我的 logback-access 配置如下所示。

<configuration>  
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>access.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>access.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
    </rollingPolicy>

    <encoder>
      <pattern>combined</pattern>
    </encoder>
  </appender>

  <appender-ref ref="FILE" />
</configuration>

现在这很完美,我可以看到访问日志。但在其他一些代码中,我想以编程方式检索在 logback-access.xml 中配置的附加程序。有没有办法做到这一点。由于没有定义 Logger,因此不能使用 LoggerContext。

【问题讨论】:

    标签: logback


    【解决方案1】:

    您可以使用 LogbackAccessContext 来检索 logback-access.xml 中配置的附加程序。这是我的解决方案:

    TomcatServletWebServerFactory sc = (TomcatServletWebServerFactory) context.getBean(TomcatServletWebServerFactory.class);
    List<Valve> values = (List<Valve>) sc.getEngineValves();
    LogbackAccessTomcatValve accessTomcatValve = null;
    for(Valve value : values) {
        if(value.getClass() == LogbackAccessTomcatValve.class) {
            accessTomcatValve = (LogbackAccessTomcatValve) value;
        }
    }
    
    //get logbackAccessContext from the logbackAccessTomcatValve by invoking.
    LogbackAccessContext logbackAccessContext = null;
    Field field = null;
    try {
        field = accessTomcatValve.getClass().getDeclaredField("logbackAccessContext");
        field.setAccessible(true);
        logbackAccessContext = (LogbackAccessContext) field.get(accessTomcatValve);
    } catch (Exception e) {
        log.error("Exception happened when fetching the logback access context ." +e.getMessage());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多