Ограничение размера сообщения с помощью пользовательского кодировщика с использованием журнала

Я пытаюсь ограничить размер сообщения журнала, мне удалось сделать это с помощью трассировки ошибок (используя 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);
    }   
    
}

person Shalom Balulu    schedule 19.07.2020    source источник


Ответы (1)


Чтобы ограничить поле message в выходных данных JSON при использовании net.logstash.logback.encoder.LogstashEncoder, вам необходимо:

  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. См. здесь.

Например:

<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();
    }
}
person Phil Clay    schedule 20.07.2020
comment
Привет Фил, прежде всего спасибо за ваш ответ! Я пытаюсь сделать это программно... можете ли вы рассказать о сеттерах/сумматорах? я искал свойства, связанные с ограничением размера сообщения в кодировщике, но не нашел таких - person Shalom Balulu; 20.07.2020
comment
Я добавил провайдера, но не нашел способа изменить существующее поле (только один, используя JsonWritingUtils.writeStringField) - person Shalom Balulu; 20.07.2020