带有嵌入式tomcat的Spring Boot应用程序,将访问日志发送到syslog
Posted
技术标签:
【中文标题】带有嵌入式tomcat的Spring Boot应用程序,将访问日志发送到syslog【英文标题】:Spring boot application with embedded tomcat, send access logs to syslog 【发布时间】:2018-07-04 05:57:29 【问题描述】:我有一个 Spring Boot 应用程序,它在 AWS EC2 实例上运行。
deployable 只是一个嵌入了 tomcat 的 jar。
我正在尝试让应用程序将其访问日志发送到 syslog,以便我可以使用 AWS CloudWatch 从不同的 EC2 实例收集日志。
我已尝试https://logback.qos.ch/access.html,但由于此问题,它不适用于 syslog:https://jira.qos.ch/browse/LOGBACK-317
然后我尝试了 CommonsRequestLoggingFilter,这似乎没有将其日志发送到 syslog。
我想尝试使用 Spring Boot 应用程序将日志发送到 syslog 并不是一个罕见的愿望。
有什么全面的方法可以做到这一点吗?
【问题讨论】:
Tomcat access logging through log4j?的可能重复 【参考方案1】:我刚刚在我的应用程序中实现了这个。 (适用于 Spring Boot 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
上面会输出你实例中的访问日志。
现在定义您的日志记录。例如在 application.yml 文件中
logging:
level:
org.springframework.web: INFO
com.project.path : DEBUG
config: <path to your config xxml>/logback-springboot.xml
以上内容将从所需位置获取您的 logback 配置文件。
现在,在您的代码中,您需要定义自己的 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());
现在在您的 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>
现在一切就绪。
【讨论】:
以上是关于带有嵌入式tomcat的Spring Boot应用程序,将访问日志发送到syslog的主要内容,如果未能解决你的问题,请参考以下文章
运行带有 SSL 和同时未加密的 Spring Boot 应用程序(嵌入式 Tomcat)
使用带有嵌入式 Tomcat 的 Spring Boot Weblfux
如何在带有嵌入式 tomcat 的 Spring Boot App 中设置域名
如何使用嵌入式 tomcat 会话集群设置 Spring Boot 应用程序?