繁体   English   中英

如何使用 logback 从 google app engine 以 jsonPayload 的形式登录到 stackdriver?

[英]How to log as jsonPayload to stackdriver from google app engine using logback?

我的 spring 启动应用程序使用 logback 以 json 格式记录消息。 该应用程序配置为使用 consolelogappender (stdout)。当日志出现在 stackdriver 中时,它们显示为 textPayload 而不是 jsonPayload。 是否可以使用 logback 将消息写入 stackdriver 中的 jsonPayload 字段? 如果不是,我有哪些选择以 json 格式登录?

基于此Github链接 ,似乎所有日志条目都被视为textpayload的问题。 它已被添加为功能请求,但尚无何时可用的ETA。

我不完全确定是否存在替代方法,因为Logback似乎可以提供大量的日志信息,但是如果您能够使用Stackdriver Logging Client ,则可以格式化该条目以便将对象作为JsonPayLoad来获取,尽管您可以您将自己指定大多数日志类别,这可能是一项额外的工作。

执行此操作的简单方法是在 LoggingEnhacer 上实现 TextPayload(JSON 格式)到JSONPayload的转换

检查此答案如何在 App Engine Flex Java 环境中使用 Stackdriver 结构化日志记录

可以通过 google-cloud-logging-logback 库。 但是,请注意以下内容(来自https://cloud.google.com/logging/docs/structured-logging ):

Note: message is saved as textPayload if it is the only field remaining
after the Logging agent moves the other special-purpose fields and
detect_json wasn't enabled; otherwise message remains in jsonPayload.
detect_json is not applicable to managed logging environments like
Google Kubernetes Engine.

要向 json 添加更多数据,请添加增强器。 例子:


import ch.qos.logback.classic.spi.ILoggingEvent;
import com.google.cloud.logging.LogEntry;
import com.google.cloud.logging.Payload;
import com.google.cloud.logging.logback.LoggingEventEnhancer;

import java.util.HashMap;


public class EventEnhancer implements LoggingEventEnhancer {

    @Override
    public void enhanceLogEntry(
            LogEntry.Builder logEntry,
            ILoggingEvent e
    ) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("thread", e.getThreadName());
        map.put("context", e.getLoggerContextVO().getName());
        map.put("logger", e.getLoggerName());

        Payload.JsonPayload payload = logEntry.build().getPayload();
        map.putAll(payload.getDataAsMap());

        logEntry.setPayload(
                Payload.JsonPayload.of(map)
        );
    }
}

配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>

<configuration scan="true">
    <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>

        <redirectToStdout>true</redirectToStdout>
        <resourceType>gae_app</resourceType>
        <loggingEventEnhancer>EventEnhancer</loggingEventEnhancer>

        <flushLevel>INFO</flushLevel>
    </appender>
    <root level="INFO">
        <appender-ref ref="CLOUD"/>
    </root>

</configuration>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM