Spring 启动带有嵌入式 tomcat 的应用程序,将访问日志发送到系统日志
Spring boot application with embedded tomcat, send access logs to syslog
我有一个 spring 启动应用程序,它在 AWS EC2 实例上运行。
可部署的只是一个嵌入了 tomcat 的 jar。
我正在尝试让应用程序将其访问日志发送到系统日志,以便我可以使用 AWS CloudWatch 从不同的 EC2 实例收集日志。
我试过了https://logback.qos.ch/access.html, but it does not work with syslog due to this issue: https://jira.qos.ch/browse/LOGBACK-317
然后我尝试了 CommonsRequestLoggingFilter,这似乎没有将其日志发送到 syslog。
我想尝试使用 Spring 引导应用程序将日志发送到系统日志并不是一种罕见的愿望。
有什么综合的方法吗?
我刚刚在我的应用程序中实现了这个。 (针对 Spring 引导 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>
现在你已经准备好了。
我有一个 spring 启动应用程序,它在 AWS EC2 实例上运行。
可部署的只是一个嵌入了 tomcat 的 jar。
我正在尝试让应用程序将其访问日志发送到系统日志,以便我可以使用 AWS CloudWatch 从不同的 EC2 实例收集日志。
我试过了https://logback.qos.ch/access.html, but it does not work with syslog due to this issue: https://jira.qos.ch/browse/LOGBACK-317
然后我尝试了 CommonsRequestLoggingFilter,这似乎没有将其日志发送到 syslog。
我想尝试使用 Spring 引导应用程序将日志发送到系统日志并不是一种罕见的愿望。
有什么综合的方法吗?
我刚刚在我的应用程序中实现了这个。 (针对 Spring 引导 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>
现在你已经准备好了。