spring-boot - 带有嵌入式tomcat的Spring Boot应用程序,将访问日志发送到syslog
问题描述
我有一个 Spring Boot 应用程序,它在 AWS EC2 实例上运行。
可部署的只是一个嵌入了 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 并不是一个罕见的愿望。
有没有全面的方法来做到这一点?
解决方案
我刚刚在我的应用程序中实现了这一点。(对于 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>
现在你们都准备好了。
推荐阅读
- python - glob 与 if 语句来选择哪些文件存储到一个变量?
- sql-server - SQL Server:安全地将数据移动到(维护不善的)历史表
- https - 我想把 kibana 带到 https 上。有什么方法可以做到
- python - 在 PyQt4 中动态创建/填充 QTableWidgets
- angular - 使用 null 过滤
- git - 使用 S3 Maven 存储库构建代码
- microsoft-translator - 无法将文件上传到 Microsoft 自定义翻译器
- c - 基于 epoll 的服务器中的空闲连接超时
- excel - 复制一行并仅粘贴那些包含公式的单元格
- javascript - React Native 重置了一些状态属性