【问题标题】:Limit message size with custom encoder using logback使用 logback 使用自定义编码器限制消息大小
【发布时间】:2020-11-09 02:06:52
【问题描述】:

我正在尝试限制日志消息的大小,我成功地通过错误回溯(使用ShortenedThrowableConverter)做到了这一点,但我没有设法找到消息本身的解决方案。

我知道一种方法是使用<pattern/>,但因为我自己实现了编码器。

我尝试使用布局,但遇到以下错误:

no applicable action for [layout], current ElementPath  is [[configuration][appender][encoder][layout]]

这是我的一些代码:

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="console-json" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="com.test.log.logback.JsonEncoder">
            <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
                <maxLength>20</maxLength>
            </throwableConverter>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="console-json" />
    </root>

    <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>

    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
    </contextListener>
</configuration>

编码器:

package com.test.log.logback;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import net.logstash.logback.stacktrace.ShortenedThrowableConverter;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;


public class JsonEncoder extends net.logstash.logback.encoder.LogstashEncoder {


    private String customFields;
    ShortenedThrowableConverter converter = new ShortenedThrowableConverter();
    public JsonEncoder() {
        converter.setMaxLength(10);
        setThrowableConverter(converter);
        setFieldNames(new FieldNames());
        setTimeZone("UTC");
        setFindAndRegisterJacksonModules(false);
    }   
    
}

【问题讨论】:

    标签: java spring-boot logging logback logstash-logback-encoder


    【解决方案1】:

    要在使用 net.logstash.logback.encoder.LogstashEncoder 时限制 JSON 输出中的 message 字段,您需要:

    1. 禁用默认的message字段输出
    2. 使用模式提供程序添加自定义 message 字段

    例如:

    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        <!-- Disable the default message field -->
        <fieldNames>
            <message>[ignore]</message>
        </fieldNames>
        <!-- Add a new message field that truncates the message to 20 characters -->
        <provider class="net.logstash.logback.composite.loggingevent.LoggingEventPatternJsonProvider">
            <pattern>{"message":"%0.-20message"}</pattern>
        </provider>
    </encoder>
    

    或作为自定义编码器:

    public class JsonEncoder extends LogstashEncoder {
        @Override
        public void start() {
            // Disable the default message field
            getFieldNames().setMessage("[ignore]");
    
            // Add a new message field that truncates the message to 20 characters
            LoggingEventPatternJsonProvider patternProvider = new LoggingEventPatternJsonProvider();
            patternProvider.setContext(getContext());
            patternProvider.setPattern("{\"message\":\"%0.-20message\"}");
            addProvider(patternProvider);
            super.start();
        }
    }
    
    

    或者,您可以使用 net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder(它是 LogstashEncoder 的超类),并完全按照您的喜好使用 JSON 提供程序构建 JSON 事件。见here

    例如:

    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <pattern>
                <pattern>
                    {
                    "timestamp": "%date{ISO8601}",
                    "message":"%0.-20message"
                    }
                </pattern>
            </pattern>
            <!--
                To add additional fields to the JSON output, either
                add the fields to the above pattern, or
                add additional JSON providers here.
             -->
        </providers>
    </encoder>
    

    或作为自定义编码器:

    public class JsonEncoder extends LoggingEventCompositeJsonEncoder {
        @Override
        public void start() {
            getProviders().addProvider(new LoggingEventFormattedTimestampJsonProvider());
    
            LoggingEventPatternJsonProvider patternProvider = new LoggingEventPatternJsonProvider();
            patternProvider.setContext(getContext());
            patternProvider.setPattern("{\"message\":\"%0.-20message\"}");
            getProviders().addProvider(patternProvider);
    
            /*
             * To add additional fields to the JSON output, either
             * add the fields to the above pattern, or
             * add additional JSON providers here.
             */
            super.start();
        }
    }
    

    【讨论】:

    • 嗨菲尔,首先感谢您的回复!我正在尝试以编程方式执行此操作...您可以花点时间了解 setter/adders 吗?我在编码器上寻找与消息大小限制相关的属性,但没有找到这样的
    • 我添加了一个提供程序,但没有找到修改现有字段的方法(仅使用 JsonWritingUtils.writeStringField 进行修改)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    相关资源
    最近更新 更多