Java 使用logback通过自定义编码器限制消息大小

Java 使用logback通过自定义编码器限制消息大小,java,spring-boot,logging,logback,logstash-logback-encoder,Java,Spring Boot,Logging,Logback,Logstash Logback Encoder,我试图限制日志消息的大小,但通过错误回溯(使用ShortenedThrowableConverter)成功地做到了这一点,但我没有找到消息本身的解决方案 我知道一种方法是使用,但因为我是自己实现编码器的 我尝试使用布局,但遇到以下错误: no applicable action for [layout], current ElementPath is [[configuration][appender][encoder][layout]] 以下是我的一些代码: logback.xml <

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

我知道一种方法是使用
,但因为我是自己实现编码器的

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

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>

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

  • 禁用默认的
    消息
    字段输出
  • 使用模式提供程序添加自定义
    消息
    字段
  • 例如:

    
    [忽略]
    {“消息”:“%0.-20消息”}
    
    或作为自定义编码器:

    公共类JsonEncoder扩展了LogstashEncoder{
    @凌驾
    公开作废开始(){
    //禁用默认消息字段
    getFieldNames().setMessage(“[ignore]”);
    //添加一个新的消息字段,将消息截断为20个字符
    LoggingEventPatternJsonProvider patternProvider=新的LoggingEventPatternJsonProvider();
    setContext(getContext());
    setPattern(“{\”消息\“:\%0.-20message\”);
    addProvider(模式提供者);
    super.start();
    }
    }
    
    或者,您可以使用
    net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder
    (它是
    LogstashEncoder
    的超类),并按照您喜欢的方式使用JSON提供程序构建JSON事件。看

    例如:

    
    {
    “时间戳”:“%date{ISO8601}”,
    消息“:%0.-20消息”
    }
    
    或作为自定义编码器:

    公共类JSONECODER扩展了LoggingEventCompositeJsonEncoder{
    @凌驾
    公开作废开始(){
    getProviders().addProvider(新的LoggingEventFormattedTimestampJsonProvider());
    LoggingEventPatternJsonProvider patternProvider=新的LoggingEventPatternJsonProvider();
    setContext(getContext());
    setPattern(“{\”消息\“:\%0.-20message\”);
    getProviders().addProvider(patternProvider);
    /*
    *要向JSON输出添加其他字段,请执行以下操作:
    *将字段添加到上述模式,或
    *在此处添加其他JSON提供程序。
    */
    super.start();
    }
    }
    
    Hi Phil,首先感谢您的回复!我正试着按程序做这件事。。。你能花点钱在设置器/加法器上吗?我在编码器上查找与消息大小限制相关的属性,但没有找到suchI添加的提供程序,但没有找到修改现有字段的方法(只有一个使用JsonWritingUtils.writeStringField)
    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);
        }   
        
    }