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

oknrviil  于 2022-11-06  发布在  Windows
关注(0)|答案(4)|浏览(276)

我尝试使用Windows 10命令行在控制台上打印彩色消息,但没有成功。根据Log4j 2文档,我应该将Jansijar添加到我的打印应用程序中,并将属性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!");
    }
}

1.以下代码是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

1.以及Windows的compileAndRun.bat文件:

@echo off
javac -cp lib\*;. LoggerTest.java
java -cp lib\*;. LoggerTest
pause 
exit

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

因此,消息包含ANSI转义码,但命令行无法解释它们。不过,如果我尝试复制/粘贴此输出并使用另一个bat文件直接回显它,则会看到彩色消息。

xkftehaa

xkftehaa1#

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

<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>
cetgtptt

cetgtptt2#

这是如何在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>

关键点是将-DLOG4J_SKIP_JANSI=false传递给JVM。在此user guide中找到了解决方案。

gudnpqoy

gudnpqoy3#

请尝试执行以下命令:“reg add HKCU\控制台/v虚拟终端级别/t REG_DWORD /d 1”
在Java中:

Runtime.getRuntime().exec("reg add HKCU\\Console /v VirtualTerminalLevel /t REG_DWORD /d 1");
kognpnkq

kognpnkq4#

我必须包含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>

相关问题