Stackdriver记录,登录和记录器名称

时间:2019-01-03 14:30:17

标签: logging logback stackdriver

我正在登录Logback,并按如下所示配置了Stackdriver Logging附加程序:

<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来用记录器的名称来增强每个日志条目,但是在增强日志条目时我没有关于该记录器的信息。

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

2 个答案:

答案 0 :(得分:0)

您可以只实现LogginEnhancer并在logback.xml文件上进行引用。

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

答案 1 :(得分:0)

这很晚了,但我遇到了同样的问题。在检查了其附加程序源代码后,我找到了解决方案。您实际上需要工具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

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