java - 2个标准输出源 - 中断写入问题
问题描述
我们在 k8s 中有几个 Spring Boot 应用程序,它们将应用程序日志和 tomcat 访问日志都写入标准输出。
当日志吞吐量非常高(由请求数量或应用日志数量引起)时,有时会发生日志行被中断的情况。
在我们的例子中,这看起来像这样:
[04/Aug/2021:13:39:27 +0200] - "GET /some/api/path?listWithIds=22838de1,e38e2021-08-04 13:39:26.774 ERROR 8 --- [ SomeThread-1] a.b.c.foo.bar.FooBarClass : Oh no, some error occured
e7fb,cd089756,1b6248ee HTTP/1.1" 200 (1 ms)
期望的状态:
[04/Aug/2021:13:39:27 +0200] - "GET /some/api/path?listWithIds=22838de1,e38ee7fb,cd089756,1b6248ee HTTP/1.1" 200 (1 ms)
2021-08-04 13:39:26.774 ERROR 8 --- [ SomeThread-1] a.b.c.foo.bar.FooBarClass : Oh no, some error occured
有什么方法可以防止这种情况发生吗?也许是 tomcat、java 或 spring-boot 设置?或容器级别的设置,以确保正确缓冲每一行
解决方案
System.out
最好是线程安全的,但这并不意味着当多个线程写入时它不会交错文本。至少出于这个原因,将应用程序日志和 HTTP 服务器日志写入同一个流对我来说似乎是一个错误,但其他原因也是如此。
如果您想将日志聚合在一起,使用字符流不是这样做的方法。相反,您需要使用一个日志框架来理解单独的日志事件,它可以连贯地写入该聚合目标。
您可能需要编写自己的AccessLogValve
子类,该子类使用您的日志框架,而不是直接写入流。
推荐阅读
- python - 如何在 Pandas Dataframe 中使用 asyncpg.copy_to_table
- node.js - async.eachOfLimit 不限制我的 http 请求数为 10
- vb.net - VB.Net Process.Start - 动词
- android - 虽然可以看到表格行单元格中的 textview 背景颜色,但也可以看到表格行背景颜色
- visual-studio-code - 在 VSCode 的评论中禁用 @param 和 @return 颜色
- database - 使用 cassandra db 进行修复的更好方法
- python - 如何提高此 python 代码的性能
- python - 获取 Qt 小部件以更新使用 Qt Designer 制作的 Qt 表单中的鼠标事件
- javascript - 节点在类异步方法中设置 this.var
- swift - Swift Vapor 向自定义响应添加附加信息