3

将错误记录到 stackdriver 时,每条消息都记录为 INFO,即使使用 log.error 或 log.warn 等,但有效负载是正确的。

在此处输入图像描述

我希望能够按严重性过滤并收到错误电子邮件。

我正在使用 Spring Boot 和 Logback。该应用程序已部署在 GCP 上的 Kubernetes 集群上。

这是我的 logback-spring.xml

<configuration>
    <include resource="org/springframework/cloud/gcp/autoconfigure/logging/logback-appender.xml" />

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{HH:mm:ss, UTC} %-5level %logger{35} - %msg %n</pattern>
        </encoder>
    </appender>

    <springProfile name="prod,qa">

        <root level="WARN">
            <appender-ref ref="STACKDRIVER" />
        </root>
    </springProfile>

</configuration>

这是在 Maven 中添加的 dep

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-gcp-starter-logging</artifactId>
</dependency>

Spring Boot 版本:2.1.3.RELEASE
Spring Cloud 版本:Greenwich.RELEASE

这个配置有什么问题?还有其他解决方案吗?

编辑:刚刚意识到上面的 STACKDRIVER 附加程序不是记录到 Stackdriver 的那个,但 STDOUT 就足够了(也许它是一个 Kubernetes 集群?),但问题仍然存在

4

2 回答 2

3

Kubernetes 的 Stackdriver 日志记录代理配置对于写入容器标准输出的任何日志默认为 INFO,对于写入标准错误的日志默认为 ERROR。如果您想对严重性进行更细粒度的控制,您可以将 Spring 配置为以单行 JSON 记录(例如,通过JsonLayout1)并让日志代理从 JSON 对象中获取严重性(请参阅https://cloud.google. com/logging/docs/agent/configuration#process-payload)。

1默认情况下,JsonLayout将使用“级别”作为日志级别,而 Stackdriver 日志记录代理识别“严重性”,因此您可能必须覆盖addCustomDataToJsonMap.

另请参阅GKE 和 Stackdriver:Java logback 日志记录格式?

于 2019-04-29T19:14:44.553 回答
1

直接使用 google cloud logging logback appender 从每个案例的日志级别获取严重性:

在 Maven 中:

<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-logging-logback</artifactId>
    <version>0.116.0-alpha</version>
</dependency>

在 logback.xml 中:

<appender name="Cloud" class="com.google.cloud.logging.logback.LoggingAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
            <log>YOUR_LOG_NAME</log>
            <resourceType>container</resourceType>
            <flushLevel>INFO</flushLevel>
</appender>

...
    <logger name="org.springframework" level="WARN" additivity="true">
        <appender-ref ref="Cloud"/>
    </logger>

它不是spring cloud组件,但解决了问题。

于 2019-11-05T14:34:23.340 回答