Как программно получить доступ к приложениям из конфигурации logback-access?

#logback

#logback

Вопрос:

Я включил журнал обратного доступа для Tomcat 7.0, используя LogbackValve. Моя конфигурация обратного доступа выглядит следующим образом.

 <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 программно. Есть ли способ сделать это. Поскольку не определены регистраторы, вы не можете использовать LoggerContext .

Ответ №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());
}