【问题标题】:Log4j 2: How to enable ANSI colours on Windows console?Log4j 2:如何在 Windows 控制台上启用 ANSI 颜色?
【发布时间】:2019-11-25 07:11:42
【问题描述】:

我尝试使用 Windows 10 命令行 在控制台上打印彩色消息,但没有成功。根据 Log4j 2 documentation,我应该将 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!");
    }
}
  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 文件直接回显它,那么我会看到彩色消息。

【问题讨论】:

  • 我得到的正是这种行为。你最后找到解决办法了吗?
  • 调试 ConsoleAppender 并发现 jansi 的本机库加载失败(在我的情况下,java.io.tmpdir 被相对路径覆盖,这弄乱了 JNI 加载器) - 修复它使颜色恢复

标签: java windows console log4j ansi


【解决方案1】:

当我将disableAnsi="false" 适当性添加到&lt;PatternLayout&gt; 时,它起作用了

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

【讨论】:

  • 在我上面的配置文件中disableAnsi已经设置为false,但它不起作用。
【解决方案2】:

这是如何在 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 中找到了解决方案。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-05-04
      • 2011-03-17
      • 2015-04-25
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多