Spring boot 带嵌入式tomcat的Spring引导应用程序,将访问日志发送到syslog

Spring boot 带嵌入式tomcat的Spring引导应用程序,将访问日志发送到syslog,spring-boot,logback,syslog,access-log,Spring Boot,Logback,Syslog,Access Log,我有一个spring引导应用程序,它在AWS EC2实例上运行 可部署的只是一个内嵌了tomcat的jar 我试图让应用程序将其访问日志发送到syslog,以便使用AWS CloudWatch从不同的EC2实例收集日志 我已经尝试过,但由于以下问题,它无法与syslog一起工作: 然后我尝试了CommonRequestLoggingFilter,这似乎并没有将其日志发送到syslog 我想尝试用Spring引导应用程序将日志发送到syslog并不是一个罕见的愿望 有什么综合方法可以做到这一点吗?

我有一个spring引导应用程序,它在AWS EC2实例上运行

可部署的只是一个内嵌了tomcat的jar

我试图让应用程序将其访问日志发送到syslog,以便使用AWS CloudWatch从不同的EC2实例收集日志

我已经尝试过,但由于以下问题,它无法与syslog一起工作:

然后我尝试了CommonRequestLoggingFilter,这似乎并没有将其日志发送到syslog

我想尝试用Spring引导应用程序将日志发送到syslog并不是一个罕见的愿望


有什么综合方法可以做到这一点吗?

我刚刚在我的应用程序中实现了这一点。(适用于弹簧护套1.5.6)

  • 确保您的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 
    
  • 现在在您的logback 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>
    
    
    514
    使用者
    514
    本地0
    

  • 现在您都准备好了。

    可能会重复
    @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());
       }
     }
    }
    
    <!--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>