当前位置: 首页 > 知识库问答 >
问题:

如何在java日志中打印自定义stacktrace?

史淇
2023-03-14

当前logback.xml

<appender name="FILEOUT3" class="ch.qos.logback.core.FileAppender">
    <file>D:/${byDay}.log</file>
    <append>true</append>
    <encoder>
        <Pattern>%d{HH:mm:ss} %-5level %msg%replace(%xException){"\n", ">> "}%nopex%n</Pattern>
    </encoder>
</appender>

当前结果:

play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [default]]
>> at play.api.Configuration$.play$api$Configuration$$configError(Configuration.scala:92) ~[play_2.10-2.2.0.jar:2.2.0]
>> at play.api.Configuration.reportError(Configuration.scala:570) ~[play_2.10-2.2.0.jar:2.2.0]
>> at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:252) ~[play-jdbc_2.10-2.2.0.jar:2.2.0]

我想要结果:

[12:43:16.454] play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [default]]
[12:43:16.454]    at play.api.Configuration$.play$api$Configuration$$configError(Configuration.scala:92) ~[play_2.10-2.2.0.jar:2.2.0]
[12:43:16.454]    at play.api.Configuration.reportError(Configuration.scala:570) ~[play_2.10-2.2.0.jar:2.2.0]
[12:43:16.454]    at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:252) ~[play-jdbc_2.10-2.2.0.jar:2.2.0]
:
:
more 40 lines
:
[12:43:16.454]    at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:252) ~[play-jdbc_2.10-2.2.0.jar:2.2.0]

共有1个答案

方高丽
2023-03-14

您不能仅通过更改logback.xml来实现这一点,因为由%replace调用的ReplacingCompositeConverter仅使用静态字符串作为替换(没有日期或PatternLayout的任何其他转换字)。

为了达到您的目标,您应该创建自定义转换器(如果您要使用我的转换器,请注意它应该放在ch.qos.logback.core.pattern包中)

package ch.qos.logback.core.pattern;

import ch.qos.logback.classic.PatternLayout;

import ch.qos.logback.core.pattern.parser.Node;
import ch.qos.logback.core.pattern.parser.Parser;
import ch.qos.logback.core.spi.ScanException;

public class ReplacingAndParsingCompositeConverter<E> extends ReplacingCompositeConverter<E> {

    @Override
    protected String transform(E event, String in) {
        if (!started) {
            return in;
        }

        String parsedReplacement;

        try {
            Parser<E> p = new Parser<E>(replacement);
            p.setContext(getContext());
            Node t = p.parse();
            Converter<E> c = p.compile(t, PatternLayout.defaultConverterMap);
            ConverterUtil.setContextForConverters(getContext(), c);
            ConverterUtil.startConverters(c);
            StringBuilder buf = new StringBuilder();
            while (c != null) {
                c.write(buf, event);
                c = c.getNext();
            }
            parsedReplacement = buf.toString();
        } catch (ScanException e) {
            e.printStackTrace();
            parsedReplacement = replacement;
        }
        return pattern.matcher(in).replaceAll(parsedReplacement);
    }
}

然后您应该在logback.xml中使用 声明这个转换器,并使用它而不是旧的%replace。

<configuration ...>
    <conversionRule conversionWord="replaceAndParse" converterClass="ch.qos.logback.core.pattern.ReplacingAndParsingCompositeConverter" />

    <appender name="FILEOUT3" class="ch.qos.logback.core.FileAppender">
        <file>D:/${byDay}.log</file>
        <append>true</append>
        <encoder>
            <Pattern>[%d{HH:mm:ss.SSS}] %-5level %msg%replaceAndParse(%xException){"(\r?\n)", "$1[%d{HH:mm:ss.SSS}]"}%nopex%n</Pattern>
        </encoder>
    </appender>
    ....
</configuration>
 类似资料:
  • 问题内容: 如何将行号打印到日志中。说在将某些信息输出到日志时,我还想在源代码中输出该行的行号。正如我们在堆栈跟踪中所看到的,它显示发生异常的行号。堆栈跟踪可用于异常对象。 其他选择可能类似于在打印到日志时手动包括行号。还有其他办法吗? 问题答案:

  • 本文向大家介绍请问如何打印日志?相关面试题,主要包含被问及请问如何打印日志?时的应答技巧和注意事项,需要的朋友参考一下 考察点:异常 cat /var/log/*.log 如果日志在更新,如何实时查看tail -f /var/log/messages 还可以使用watch -d -n 1 cat /var/log/messages -d表示高亮不同的地方,-n表示多少秒刷新一次。

  • 本文向大家介绍Spring Boot如何通过自定义注解实现日志打印详解,包括了Spring Boot如何通过自定义注解实现日志打印详解的使用技巧和注意事项,需要的朋友参考一下 前言 在我们日常的开发过程中通过打印详细的日志信息能够帮助我们很好地去发现开发过程中可能出现的Bug,特别是在开发Controller层的接口时,我们一般会打印出Request请求参数和Response响应结果,但是如果这些

  • 本文向大家介绍Flutter实战之自定义日志打印组件详解,包括了Flutter实战之自定义日志打印组件详解的使用技巧和注意事项,需要的朋友参考一下 在Flutter中,如果我们需要打印日志,如果不进行自定义,我们只能使用自带的 print() 或者 debugPrint() 方法进行打印,但是这两种打印,日志都是默认 Info 层级的日志,很不友好,所以如果需要日志打印层级分明,我们就需要自定义一

  • 环境:Java、Selenium webdriver、Maven、testNG、Log4J、Eclipse XML 我添加了log4j。src/main/resources下的属性。 在基本测试中。java,我在导入log4j后添加了两行。 日志信息(“方法设置”); 日志信息(“方法拆除”); 我的目标是能够使用日志。了解整个项目。在此之前,我只想通过在basetest类中导入log4j log

  • 当我运行这段代码时,没有任何东西被打印到控制台。我应该如何使用logp?