在 Windows 10 64 位上对控制台显示进行 Ansi 编码时,logback 出现异常

问题描述 投票:0回答:3

找不到这个问题的答案,任何人都可以提出修复方案。

我正在构建和使用 logback (logabck 1.2.3,jansi 1.16)和 groovy 的库 jar,并且我正在尝试对日志显示进行颜色编码 - 正如 Spring Boot 设法做到的那样 - 但我不想spring boot 作为我正在构建的这个库的依赖项。

我已将 jansi(1.16,如 logabck 文档中所述)库作为 gradle 构建的依赖项包含在内。

我的 logback.groovy 的相关部分看起来像这样

appender('STDOUT', ConsoleAppender) {
    withJansi = true
    encoder(PatternLayoutEncoder) {
        charset = Charset.forName('UTF-8')
        pattern = consolePatternFormat
    }
} 

当我运行测试时,我遇到这样的错误(启用了 jansi)

16:17:42,344 |-WARN in com.softwood.logging.logback.AnsiConsoleAppender[STDOUT] - Failed to create WindowsAnsiOutputStream. Falling back on the default stream. ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type org.fusesource.jansi.WindowsAnsiOutputStream
    at ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type org.fusesource.jansi.WindowsAnsiOutputStream
    at  at ch.qos.logback.core.util.OptionHelper.instantiateByClassNameAndParameter(OptionHelper.java:69)
    at  at ch.qos.logback.core.util.OptionHelper.instantiateByClassNameAndParameter(OptionHelper.java:40)
    at  at ch.qos.logback.core.ConsoleAppender.getTargetStreamForWindows(ConsoleAppender.java:88)
    at  at ch.qos.logback.core.ConsoleAppender.start(ConsoleAppender.java:79)
...
Caused by: java.lang.reflect.InvocationTargetException
    at  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at  at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at  at ch.qos.logback.core.util.OptionHelper.instantiateByClassNameAndParameter(OptionHelper.java:64)

这里有一个建议https://jira.qos.ch/browse/LOGBACK-762,所有需要做的就是包装输出流,所以我在我的项目中创建了一个自定义控制台附加程序,如下所示

import java.io.OutputStream;
import org.fusesource.jansi.AnsiConsole;
import ch.qos.logback.core.ConsoleAppender;

public class AnsiConsoleAppender<E> extends ConsoleAppender<E> {

    @Override
    public void setOutputStream(OutputStream outputStream) {
        super.setOutputStream(AnsiConsole.wrapOutputStream(outputStream));
    }
}

并修改了 logback.groovy 附加程序以使用 AnsiConsoleAppender 像这样

 appender('STDOUT', AnsiConsoleAppender) {
        withJansi = true
        encoder(PatternLayoutEncoder) {
            charset = Charset.forName('UTF-8')
            pattern = consolePatternFormat
        }
    }

然而,这和以前一样失败了。如果我禁用 jansi 支持 - 一切都会如您所期望的那样工作。当我启用 jansi 并运行测试时,这些测试会失败,如图所示

颜色日志记录与 springboot 一起使用,你会得到彩色控制台,所以有人知道如何做到这一点。但我不知道 logback 问题是什么

有人在 Windows 下获得了 logback (1.2.3) 的基本 jansi 颜色编码吗?如果是的话,秘密是什么。

目前我不得不禁用它,但想让它发挥作用。有点沮丧

windows groovy logback ansi-colors logback-groovy
3个回答
9
投票

我通过 REMOVING withJansi 解决了同样的问题

<!-- <withJansi>true</withJansi> -->

1
投票

转到> TOMCAT安装文件夹

您将在 TOMCAT_INSTALL_DIR/conf/logback.xml 内的 logback.xml 文件中找到此设置

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <!--  <withJansi>${exo.logs.jansi.console:-false}</withJansi>-->
    <encoder>
      <pattern>${exo.logs.console.appender.pattern:-${exo.logs.default.pattern}}</pattern>
    </encoder>
  </appender>

清理tomcat并再次运行将明确解决您的问题。


0
投票

真正解决了本地系统生成jenkins报告的问题

© www.soinside.com 2019 - 2024. All rights reserved.