Spring загрузочное приложение со встроенным tomcat, отправка журналов доступа в системный журнал - PullRequest
0 голосов
/ 04 июля 2018

У меня есть приложение с пружинной загрузкой, которое работает на экземплярах AWS EC2.

Развертываемый это просто баночка со встроенным котом.

Я пытаюсь заставить приложение отправить свой журнал доступа в системный журнал, чтобы я мог использовать AWS CloudWatch для сбора журналов из разных экземпляров EC2.

Я пробовал https://logback.qos.ch/access.html,, но он не работает с системным журналом из-за этой проблемы: https://jira.qos.ch/browse/LOGBACK-317

Затем я попробовал CommonsRequestLoggingFilter, похоже, он не отправляет свои журналы в системный журнал.

Полагаю, попытка отправить журналы в системный журнал с помощью загрузочного приложения Spring - не редкое желание.

Есть ли какой-нибудь всеобъемлющий способ сделать это?

1 Ответ

0 голосов
/ 31 августа 2018

Я только что реализовал это в своем приложении. (Для весенней загрузки 1.5.6)

  1. Убедитесь, что ваша регистрация доступа tomcat включена, ниже описано, как регистрация доступа включена в application.yml -

    server: 
     tomcat:
      accesslog:
        enabled: true
        pattern: "<APPNAME> %h %l %u %t \"%r\" %s %b %D"
        prefix: "localhost_access_log"
        suffix: .txt
      basedir: /opt/tomcat 
    
  2. Выше будет выводить журналы доступа в ваших экземплярах.

  3. Теперь определите ваш журнал. Например, в файле application.yml

    logging:
      level:
        org.springframework.web: INFO
        com.project.path : DEBUG
      config: <path to your config xxml>/logback-springboot.xml
    
  4. Приведенный выше файл конфигурации для входа в систему будет возвращен из нужного места.
  5. Теперь в вашем коде вам нужно определить собственную конфигурацию доступа tomcat. Например -

    @Configuration
    public class AccessValveConfig extends WebMvcConfigurerAdapter implements
     EmbeddedServletContainerCustomizer {
    
     private static XLogger logger = XLoggerFactory
        .getXLogger(AccessValveConfig.class);
    
    
     @Override
      public void customize(ConfigurableEmbeddedServletContainer container) {
    
         if (container instanceof TomcatEmbeddedServletContainerFactory) {
    
            TomcatEmbeddedServletContainerFactory factory = 
                  (TomcatEmbeddedServletContainerFactory) container;
            AbstractAccessLogValve accessLogValve = new ApiAccessLogValve();
            accessLogValve.setPattern("common");
            factory.addContextValves(accessLogValve);
         } else {
         logger.error("WARNING! this customizer does not support your 
                 configured container");
        }
     }
    }
    
    public class ApiAccessLogValve extends AbstractAccessLogValve {
    
      private static XLogger logger = XLoggerFactory
        .getXLogger(ApiAccessLogValve.class);
    
      public ApiAccessLogValve(){
       super();
      }
    
     @Override
     protected void log(CharArrayWriter message) {
       synchronized (this) {
        logger.info(message.toString());
       }
     }
    }
    
  6. Теперь внесите необходимые конфиги в ваш xml логбэк.

    <!--This will print app logs in user facility-->
    <appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
     <syslogHost><<your host name>></syslogHost>
     <port>514</port>
     <facility>USER</facility>
     <suffixPattern><<your pattern>></suffixPattern>
    </appender>
    <!-- This will print your access logs in local0 facility-->
    <appender name="LOCAL0" class="ch.qos.logback.classic.net.SyslogAppender">
      <syslogHost><<your host name>></syslogHost>
      <port>514</port>
      <facility>LOCAL0</facility>
      <suffixPattern><<pattern>></suffixPattern>
    </appender>
    
    <Logger name="package path to ApiAccessLogValve" level="INFO" 
        additivity="false">
       <appender-ref ref="LOCAL0" />
    </Logger>
    

Теперь все готово.

...