2 stdout 源 - 中断写入问题
2 stdout sources - interrupted writing problem
我们在 k8s 中有几个 spring 启动应用程序,它们将应用程序日志和 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
子类,它使用您的日志记录框架而不是直接写入流。
我们在 k8s 中有几个 spring 启动应用程序,它们将应用程序日志和 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
子类,它使用您的日志记录框架而不是直接写入流。