logback:换行符在异常堆栈跟踪之前,但是不是这样吗?

用户名

如果在记录模式中在异常堆栈跟踪之前放置换行符:

<Pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{36} %msg %n %rEx{short} %n</Pattern>

然后会打印一条额外的换行符,因此普通的日志记录语句之间将以空行结尾。

如果我删除多余的换行符:

<Pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{36} %msg %rEx{short} %n</Pattern>

那么堆栈跟踪就不会从新的一行开始,从而使它们难以阅读。

谁能想到一种获取日志回溯的方法,以便仅在有堆栈跟踪时才打印多余的换行符,否则就不打印?

马尔斯

我有一个可行的解决方案,但我不喜欢它,因为它经过了精心设计,应该更加优雅。

这是一个更为通用的问题的特殊情况:仅当某个评估程序(检查异常是否存在)匹配时,才输出模式。我很早以前就从这里的某个地方得到了实现。

需要janino。如果有比我更日志经验的人可以将其缩减为更合理的代码量,请这样做。

IfPresentConverter.java

public class IfPresentConverter extends CompositeConverter<ILoggingEvent> {
    private final List<EventEvaluator<ILoggingEvent>> evaluatorList = new ArrayList<>();
    private int errorCount = 0;

    @Override
    @SuppressWarnings("unchecked")
    public void start() {
        final List<String> optionList = getOptionList();
        final Map<?, ?> evaluatorMap = (Map<?, ?>) getContext().getObject(CoreConstants.EVALUATOR_MAP);

        for (final String evaluatorStr : optionList) {
            final EventEvaluator<ILoggingEvent> ee = (EventEvaluator<ILoggingEvent>) evaluatorMap.get(evaluatorStr);
            if (ee != null) {
                evaluatorList.add(ee);
            }
        }

        if (evaluatorList.isEmpty()) {
            addError("At least one evaluator is expected, but you have declared none.");
            return;
        }

        super.start();
    }

    @Override
    public String convert(final ILoggingEvent event) {
        boolean evalResult = true;
        for (final EventEvaluator<ILoggingEvent> ee : evaluatorList) {
            try {
                if (!ee.evaluate(event)) {
                    evalResult = false;
                    break;
                }
            } catch (final EvaluationException eex) {
                evalResult = false;

                errorCount++;
                if (errorCount < CoreConstants.MAX_ERROR_COUNT) {
                    addError("Exception thrown for evaluator named [" + ee.getName() + "].", eex);
                } else {
                    final ErrorStatus errorStatus = new ErrorStatus("Exception thrown for evaluator named [" + ee.getName() + "].", this, eex);
                    errorStatus.add(new ErrorStatus("This was the last warning about this evaluator's errors. " + "We don't want the StatusManager to get flooded.", this));
                    addStatus(errorStatus);
                }
            }
        }

        if (evalResult) {
            return super.convert(event);
        } else {
            return CoreConstants.EMPTY_STRING;
        }
    }

    @Override
    protected String transform(final ILoggingEvent event, final String in) {
        return in;
    }
}

logback.xml

<configuration>
    <conversionRule conversionWord="ifPresent" converterClass="org.example.IfPresentConverter"/>

    <evaluator name="has_ex">
        <expression>return throwableProxy != null;</expression>
    </evaluator>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>lorem ipsum %msg{}%ifPresent(\n%ex{full}){has_ex}%n</pattern>
        </encoder>
    </appender>

    <root>
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从Logback中的Java堆栈跟踪中删除换行符?

来自分类Dev

从命令行运行时,堆栈跟踪中没有换行符吗?

来自分类Dev

logback:控制异常堆栈跟踪的格式

来自分类Dev

按换行符而不是换行符的Git差异

来自分类Dev

以bash输出之前的换行符(“ \ n”)

来自分类Dev

正则表达式匹配之前删除换行符\换行符

来自分类Dev

按$然后按Enter在最后一个字符之前(而不是之后)添加换行符

来自分类Dev

如何通过换行符分割字符串,而不是连续丢失多个换行符?

来自分类Dev

在根节点之前的xml文件中添加换行符

来自分类Dev

文本框在加号之前显示换行符

来自分类Dev

缩进列表换行符:在内容之前

来自分类Dev

如何在<ul>开始之前删除此换行符?

来自分类Dev

添加继承时,在':'之前删除换行符

来自分类Dev

删除tty中`/ etc / issue`之前的换行符

来自分类Dev

缩进列表行换行符:在内容之前

来自分类Dev

如何在PayPal按钮的图像之前创建换行符?

来自分类Dev

Javascript在“-”之前和“。”之后添加换行符。

来自分类Dev

在文件中添加文本之前添加换行符

来自分类Dev

Python是不是捕捉异常

来自分类常见问题

如何删除换行符,而不是添加逗号?

来自分类Dev

R Markdown文本中的换行符(不是代码块)

来自分类Dev

xargs在换行符处分割而不是空格

来自分类Dev

在Json.Net中生成换行符而不是CRLF

来自分类Dev

扩展div以适合浮动儿童而不是插入换行符

来自分类Dev

如何删除换行符,而不是添加逗号?

来自分类Dev

在单词之间添加空格而不是PHP中的换行符

来自分类Dev

为什么`sudo -i`而不是`sudo`删除换行符?

来自分类Dev

打印 \n 但不是美观的换行符?

来自分类Dev

缺少换行符?

Related 相关文章

  1. 1

    如何从Logback中的Java堆栈跟踪中删除换行符?

  2. 2

    从命令行运行时,堆栈跟踪中没有换行符吗?

  3. 3

    logback:控制异常堆栈跟踪的格式

  4. 4

    按换行符而不是换行符的Git差异

  5. 5

    以bash输出之前的换行符(“ \ n”)

  6. 6

    正则表达式匹配之前删除换行符\换行符

  7. 7

    按$然后按Enter在最后一个字符之前(而不是之后)添加换行符

  8. 8

    如何通过换行符分割字符串,而不是连续丢失多个换行符?

  9. 9

    在根节点之前的xml文件中添加换行符

  10. 10

    文本框在加号之前显示换行符

  11. 11

    缩进列表换行符:在内容之前

  12. 12

    如何在<ul>开始之前删除此换行符?

  13. 13

    添加继承时,在':'之前删除换行符

  14. 14

    删除tty中`/ etc / issue`之前的换行符

  15. 15

    缩进列表行换行符:在内容之前

  16. 16

    如何在PayPal按钮的图像之前创建换行符?

  17. 17

    Javascript在“-”之前和“。”之后添加换行符。

  18. 18

    在文件中添加文本之前添加换行符

  19. 19

    Python是不是捕捉异常

  20. 20

    如何删除换行符,而不是添加逗号?

  21. 21

    R Markdown文本中的换行符(不是代码块)

  22. 22

    xargs在换行符处分割而不是空格

  23. 23

    在Json.Net中生成换行符而不是CRLF

  24. 24

    扩展div以适合浮动儿童而不是插入换行符

  25. 25

    如何删除换行符,而不是添加逗号?

  26. 26

    在单词之间添加空格而不是PHP中的换行符

  27. 27

    为什么`sudo -i`而不是`sudo`删除换行符?

  28. 28

    打印 \n 但不是美观的换行符?

  29. 29

    缺少换行符?

热门标签

归档