如何在App Engine Flex Java环境中使用Stackdriver Structured日志记录

时间:2018-06-21 21:54:57

标签: java google-app-engine

Google App Engine灵活的环境会自动将stdout和stderr传送到Stackdriver(Google Cloud Logging)。但这仅支持不带任何元数据的纯文本日志消息(甚至不包括日志级别)。

我找到了用于Google云日志记录的Logback附加程序。

https://cloud.google.com/logging/docs/setup/java

但是,这似乎还不支持结构化日志记录。 而且,它还可以对内部的每个日志条目进行GRPC调用。因此,我想知道它的可扩展性(尤其是与具有单独的Fluentd代理处理日志的当前应用程序引擎结构相比)。

是否有任何现成的或简单的解决方案可以将结构化日志从App Engine发送到Stackdriver?

2 个答案:

答案 0 :(得分:0)

很有可能在StackDriver日志记录中进行结构化日志记录。实际上,每个单独的日志条目都使用LogEntry structure。如您所见,它包括严重性和元数据。

根据App Engine documentation,提供了以下开箱即用的日志:

  

请求日志记录了发送到所有App Engine应用程序的请求。默认情况下会提供请求日志,您不能选择不接收它。

     

App日志记录App Engine应用程序中软件的活动。的   日志是默认提供的,您不能选择不接收它。

     

运行时日志是使用以下命令从灵活环境中提供的:   预安装的日志记录代理。

答案 1 :(得分:0)

您可以使用Logback附加程序+实施 LoggingEnhacer

public class LogEnhancer implements LoggingEnhancer {


  @Override
  public void enhanceLogEntry(LogEntry.Builder logEntry) {
    // add Labels
    logEntry.addLabel("project", "conversational-services");

    // Transform textPayload to JSONPayload
    ObjectMapper mapper = new ObjectMapper();
    Builder structBuilder = Struct.newBuilder();
    String textPayload = logEntry.build().getPayload().getData().toString();
    try {
      // Validate JSON Payload
      mapper.readTree(textPayload);
      JsonFormat.parser().merge(textPayload, structBuilder);
      logEntry.setPayload(JsonPayload.of(structBuilder.build()));
    } catch (InvalidProtocolBufferException e) {
      // Error reporting an error! FML
      System.err.println(e.getMessage());
    } catch (IOException e) {
      // Do nothing (there is not a JSON Payload)
    }

  }

}

该类添加标签并在JSONPayload中转换JSON字符串

您需要在 logback.xml 文件

上指定 LoggingEnhacer
<!DOCTYPE configuration>
<configuration>
  <appender name="CLOUD" class="com.google.cloud.logging.logback.LoggingAppender">

    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>
    <log>application.log</log> 
    <resourceType>gae_app</resourceType> 
    <!--  References to the LoggingEnhacer class -->
     <enhancer>[path_for_your_logging_enhancer_class]</enhancer>
    <flushLevel>WARN</flushLevel> 
  </appender>

  <root level="info">
    <appender-ref ref="CLOUD" />
  </root>
</configuration>