Log4j 2:如何在Windows控制台上启用ANSI颜色?

6

我尝试使用Windows 10命令行在控制台上打印彩色消息,但没有成功。根据Log4j 2的文档,我应该将Jansi jar添加到我的打印应用程序中,并将属性log4j.skipJansi设置为false以在Windows上启用ANSI支持。请问,您能否检查并告诉我我做错了什么:

  1. 以下代码是我的当前工作:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LoggerTest {
    private static final Logger logger = LogManager.getLogger();

    public static void main(String[] args) throws Exception {
        logger.info("Hello!");
    }
}

以下是Log4j 2配置文件的代码:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

    <Properties>
        <Property name="log4j.skipJansi" value="false"/>
    </Properties>

    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT">
            <PatternLayout>
                <disableAnsi>false</disableAnsi>
                <Pattern>%style{%d [%t] %c %p: %m}{yellow}%n%ex</Pattern>
            </PatternLayout>
        </Console>
    </Appenders>

    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="ConsoleAppender"/>
        </Root>
    </Loggers>

</Configuration>
  1. \lib 目录的内容:
log4j-core-2.12.1.jar
log4j-api-2.12.1.jar
jansi-1.18.jar
  • 还有 Windows 的 compileAndRun.bat 文件:
  • @echo off
    javac -cp lib\*;. LoggerTest.java
    java -cp lib\*;. LoggerTest
    pause 
    exit 
    

    然而,在命令行中输出仍然没有颜色。这是我看到的:

    enter image description here

    所以,该消息包含 ANSI 转义码,但命令行未对其进行解释。不过,如果我尝试复制/粘贴此输出并直接使用另一个批处理文件进行回显,则可以看到彩色消息。


    我也遇到了完全相同的问题。你最终找到解决方案了吗? - John Deverall
    调试了 ConsoleAppender,发现 jansi 的本地库加载失败(在我的情况下,java.io.tmpdir 被覆盖为相对路径,这破坏了 JNI 加载器)- 修复后颜色恢复正常。 - Janaka Bandara
    5个回答

    7

    当我在<PatternLayout>中添加disableAnsi="false"属性时,它起作用了。

     <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT">
            <PatternLayout
                pattern="%highlight{%p} %logger{-2} - %m{FATAL=red blink,ERROR=red, WARN=yellow bold, INFO=green, DEBUG=green bold}%n" disableAnsi="false"/>
            </Console>
        </Appenders> 
    

    1
    在我的配置文件中,disableAnsi 已经设置为 false,但它并没有起作用。 - escudero380

    1

    以下是如何在Windows 7上使用最新的log4j启用颜色的答案:

    openjdk 14
    log4j 2.14.1
    jansi 1.18
    

    配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="INFO">
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%-5level}{FATAL=red blink, ERROR=red bold, WARN=yellow bold, INFO=magenta, DEBUG=green, TRACE=blue} %logger{36} - %msg%n"/>
            </Console>
        </Appenders>
        <Loggers>
            <Root level="debug">
                <AppenderRef ref="Console"/>
            </Root>
        </Loggers>
    </Configuration>
    

    关键是向JVM传递-DLOG4J_SKIP_JANSI=false。解决方案在user guide中找到。

    1
    尝试执行以下命令:"reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1"
    在Java中:
    Runtime.getRuntime().exec("reg add HKCU\\Console /v VirtualTerminalLevel /t REG_DWORD /d 1");
    

    1

    我必须同时包含Jansi和Jcabi以进行跨操作系统的渲染 -

    
            <dependency>
                <groupId>org.fusesource.jansi</groupId>
                <artifactId>jansi</artifactId>
                <version>1.18</version>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>com.jcabi</groupId>
                <artifactId>jcabi-log</artifactId>
                <version>LATEST</version>
                <optional>true</optional>
            </dependency>
    

    1
    对我来说,需要添加一行代码:
    AnsiConsole.systemInstall();
    

    之后,彩色输出在Windows 10 cmd中开始工作,但在Eclipse控制台中停止工作,因此我在我的主方法中添加了特殊参数来调用它。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接