【问题标题】:Stackdriver Logging, Logback, and Logger NamesStackdriver Logging、Logback 和 Logger 名称
【发布时间】:2019-01-03 14:30:16
【问题描述】:

我正在登录到 Logback 并配置了 Stackdriver Logging appender,如下所示:

<appender name="CLOUD" class="com.google.cloud.logging.logback.LoggingAppender">
    <log>application.log</log>
    <resourceType>generic_node</resourceType>
    <flushLevel>INFO</flushLevel>
</appender>

日志条目显示在 Stackdriver Logging 控制台中:

{
  insertId: "[...]"
  labels: {
    levelName: "INFO"
    levelValue: "20000"
  }
  logName: "[...]"
  receiveTimestamp: "2019-01-03T13:42:10.888423743Z"
  resource: {
    labels: {
      location: ""
      namespace: ""
      node_id: ""
      project_id: "[...]"
    }
    type: "generic_node"
  }
  severity: "INFO"
  textPayload: "client disconnected"
  timestamp: "2019-01-03T13:42:10.841Z"
}

但是,我缺少有关日志消息源自的记录器的信息。具体来说,假设我记录这样的消息:

import org.slf4j.LoggerFactory
val log = LoggerFactory.getInstance("component-a")
log.warn("temperature in hell fell below 100°C")

然后我想看看日志消息来自名为“component-a”的记录器。我发现在 Stackdriver Logging 文档中没有提到如何实现这一点。我想我可以配置一个LoggingEnhancer 来使用记录器的名称来增强每个日志条目,但是在增强日志条目时我没有关于这个记录器的信息。

是否有(希望是“规范的”)解决方案?

【问题讨论】:

  • 对于Log Entries,可以设置标签;但是,在使用 LoggerFactory 时,我找不到任何设置标签的方法。我建议在以下 github 链接上创建一个功能请求,以添加一个功能,您可以在使用 LoggerFactory 时设置标签:github.com/googleapis/google-cloud-java/issues

标签: logging logback stackdriver


【解决方案1】:

这已经很晚了,但我遇到了同样的问题。我在检查了他们的 appender 源代码后找到了解决方案。你实际上需要实现LoggingEventEnhancer

public class StackDriverLoggingEnhancer implements LoggingEventEnhancer{
    @Override
    public void enhanceLogEntry(Builder builder, ILoggingEvent e) {
        builder.addLabel("logger", e.getLoggerName());
        builder.addLabel("thread", e.getThreadName());
    }

}

在 logback.xml 中

<configuration>
    <appender name="CLOUD"
        class="com.google.cloud.logging.logback.LoggingAppender">
        <resourceType>k8s_pod</resourceType>
        <loggingEventEnhancer>YOUR_PACKAGE.StackDriverLoggingEnhancer
        </loggingEventEnhancer>
        <log>application.log</log> <!-- Optional : default java.log -->
        <flushLevel>INFO</flushLevel> <!-- Optional : default ERROR -->
    </appender>
    ...
</configuration>

-----更新---------- 资源类型应为以下之一

container
gae_app_flex
gae_app_standard
gce_instance
global

或为空(自动检测),而不是自 0.77.0-alpha 版起 Google 提供的 document

【讨论】:

    【解决方案2】:

    您可以在 logback.xml 文件中实现 LogginEnhancer 和引用。

    public class LogEnhancer implements LoggingEnhancer {
    
      @Override
      public void enhanceLogEntry(LogEntry.Builder logEntry) {
        logEntry.addLabel("test-label-1", "test-value-1");
      }
    
    }
    

    logback.xml

    <configuration>
      <appender name="CLOUD" class="com.google.cloud.logging.logback.LoggingAppender">
        <!-- Optional : filter logs at or above a level -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
          <level>INFO</level>
        </filter>
        <log>application.log</log> <!-- Optional : default java.log -->
        <resourceType>gae_app</resourceType> <!-- Optional : default: auto-detected, fallback: global -->
        <enhancer>com.gentera.conversationalservices.exception.LogEnhancer</enhancer>  <!-- Optional -->
        <flushLevel>WARN</flushLevel> <!-- Optional : default ERROR -->
      </appender>
    
      <root level="info">
        <appender-ref ref="CLOUD" />
      </root>
    </configuration>
    

    这是 Github 上的完整示例:

    Getting Started with Stackdriver Logging using Logback

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多