logback 消息字段可以是 truncated/trimmed 到 n 个字符吗?

Can a logback message field be truncated/trimmed to n characters?

有时会看到巨大的日志消息,但并不总是能够(轻松)关闭自动换行。

有没有办法通过 logback.xml%message 截断为 80 个字符?

查看格式修饰符部分:

来自http://logback.qos.ch/manual/layouts.html#formatModifiers

格式修饰符

默认情况下,相关信息按原样输出。但是,在格式修饰符的帮助下,可以更改最小和最大宽度以及每个数据字段的对齐方式。

...

可以通过在句点后紧跟一个负号来截断末尾。在那种情况下,如果最大字段宽度为八,数据项长度为十个字符,则数据项的最后两个字符将被删除。

如果您只需要截断消息,Adrian 的回答就很好。但是在我的例子中,我想在消息真正被截断的情况下添加“... [截断]”。

我为此使用了 a custom convertors 机制 - 通过执行以下步骤:

  1. 定义自定义转换器:
public class LongMessagesConverter extends ClassicConverter {
    private static final int MAX_FORMATTED_MESSAGE_LENGTH = 25600;
    private static final String TRUNCATION_SUFFIX = "... [truncated]";
    private static final int TRUNCATED_MESSAGE_SIZE =
            TRUNCATION_SUFFIX.length() + MAX_FORMATTED_MESSAGE_LENGTH;

@Override
public String convert(ILoggingEvent event) {
    String formattedMessage = event.getFormattedMessage();
    if (formattedMessage == null || 
                 formattedMessage.length() < MAX_FORMATTED_MESSAGE_LENGTH) {
        return formattedMessage;
    }
    return new StringBuilder(TRUNCATED_MESSAGE_SIZE)
            .append(formattedMessage.substring(0, MAX_FORMATTED_MESSAGE_LENGTH))
            .append(TRUNCATION_SUFFIX)
            .toString();
    }
}
  1. 将以下定义添加到您的 logback.xml 中:
<conversionRule conversionWord="boundedMsg" converterClass="your.package.LongMessagesConverter"/>
  1. %boundedMsg 替换消息格式模式中的 %msg 标记