为什么 Stackdriver 不从 Compute Engine 实例 运行 的 Slf4j 日志中捕获日志级别 Docker 图像?

Why isn't Stackdriver capturing log levels from Slf4j logs from Compute Engine Instance running a Docker Image?

我目前有一个 gradle Spring 引导应用程序 运行 作为 GCP Compute Engine 实例中的 Docker 映像。在我的应用程序中,我添加了 lombok @Slf4j 注释,在主要方法中,我通过 docker run -d --rm -it -p 8888:8080 {image} 在我的 GCE 实例中添加了行 log.info("Hello world"); 和 运行 图像,并检查了 Stackdriver 日志。

我希望能够通过日志级别(信息、警告等)进行过滤,但日志似乎没有正确映射日志级别,这意味着它们仅在 "log level: Any" 过滤器被选中。

上面的 log.info() 语句在 Stackdriver 中显示如下:

[2m2019-10-01 17:55:41.159[0;39m [32m INFO[0;39m [35m1[0;39m [2m---[0;39m [2m[nio-8080-exec-5][0;39m [36mc.g.o.Application [0;39m [2m:[0;39m Hello world

使用 Json 负载:

jsonPayload: { container: {} instance: {} message: "[2m2019-10-01 17:55:41.159[0;39m [32m INFO[0;39m [35m1[0;39m [2m---[0;39m [2m[nio-8080-exec-5][0;39m [36mc.g.o.Application [0;39m [2m:[0;39m Hello world" }

和"logname"是projects/my-project/logs/gcplogs-docker-driver

即使使用了 gcplogs-docker-driver,为什么 Stackdriver 不从 Slf4j 捕获日志级别?

它看起来像 Docker 的 gcplogs-docker-driver causes the output to be sent to GCP's Stackdriver Logging (aka Cloud Logging). The gcplogs driver just sends each input line as-is with no further processing. There doesn't seem to be any appetite in docker/moby to do additional processing,例如试图提取严重性。

你也许可以做一些after-the-fact labelling,但我从未尝试过。

请注意,某些平台支持在将条目提交到 Stackdriver Logging 之前执行额外的处理。例如,GKE 使用 supports structured logs 的 Stackdriver Logging Agent 记录控制台输出,这些输出是 JSON 编码的有效负载。或者,您可以将应用程序的日志记录框架配置为直接记录到 Stackdriver Logging。