【问题标题】:GCP and Spring logback. Severity is always infoGCP 和 Spring 回退。严重性始终是信息
【发布时间】:2019-09-12 00:31:49
【问题描述】:

当将错误记录到 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 appender 不是记录到 Stackdriver 的那个,但 STDOUT 就足够了(也许它是一个 Kubernetes 集群?),但问题仍然存在

【问题讨论】:

标签: spring-boot google-cloud-platform logback stackdriver spring-cloud-gcp


【解决方案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组件而是解决问题的。

【讨论】:

  • 最基本的配置:
【解决方案2】:

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

1默认情况下,JsonLayout 将使用“level”作为日志级别,而 Stackdriver 日志代理 recognizes“severity”,因此您可能必须覆盖 addCustomDataToJsonMap

另见GKE & Stackdriver: Java logback logging format?

【讨论】:

  • 我扩展了 JsonLayout 并覆盖了 addCustomDataToJsonMap,将“严重性”添加到地图,然后使用 ConsoleAppender 的该布局更改了 xml,但即使我可以在本地看到它,我也看不到它堆栈驱动程序
  • 其他 SO 的答案虽然做到了 :)
猜你喜欢
  • 2016-09-30
  • 1970-01-01
  • 2021-12-08
  • 2020-01-29
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
相关资源
最近更新 更多