Google App Engine灵活的环境会自动将stdout和stderr传送到Stackdriver(Google Cloud Logging)。但这仅支持不带任何元数据的纯文本日志消息(甚至不包括日志级别)。
我找到了用于Google云日志记录的Logback附加程序。
https://cloud.google.com/logging/docs/setup/java
但是,这似乎还不支持结构化日志记录。 而且,它还可以对内部的每个日志条目进行GRPC调用。因此,我想知道它的可扩展性(尤其是与具有单独的Fluentd代理处理日志的当前应用程序引擎结构相比)。
是否有任何现成的或简单的解决方案可以将结构化日志从App Engine发送到Stackdriver?
答案 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>