1

如果 System.out 启用了 Ansi,我正在尝试使用带有颜色输出的Logback,在 Windows 10 上使用 Groovy v3、java 11。

我想让我的 logback.groovy 配置根据检测我的控制台的标准输出是否启用 ansi 来切换 appender 格式字符串。

我试图在网上找到一个简单的答案,但没有设法解决。但是通过查看 fusesource jansi 库中的一些代码,我可以看到这样的事情(以及相关的静态导入等)

final int VIRTUAL_TERMINAL_PROCESSING = 0x0004
**long console = GetStdHandle(STD_OUTPUT_HANDLE)
int[] mode = new int[1]
def ansiEnabled = Kernel32.GetConsoleMode(console, mode)**
println "appended is ansi enabled $ansiEnabled"

当我在我的机器上运行它时,它返回一个值 0

我的彩色日志记录确实对我有用 - 所以我的 System.out 隐含地启用了 ansi

所以查询 0 是否正确表示我已启用?

我在 jansi 库中找到了类似这样的附加代码,它显示了设置 VTmode,这表明如果 mode == 0 则其为 false(即未启用 ansi)。我还没有尝试在我的示例代码中尝试强制设置控制台。

private static boolean setVTMode() {
    long console = GetStdHandle(STD_OUTPUT_HANDLE);
    int[] mode = new int[1];
    if (Kernel32.GetConsoleMode(console, mode) == 0) {
        // No need to go further, not supported.
        return false;
    }
    if (Kernel32.SetConsoleMode(console, mode[0] | VIRTUAL_TERMINAL_PROCESSING) == 0) {
        // No need to go further, not supported.
        return false;
    }

    return true;
}

public static boolean isVTSupported() {
    return setVTMode();
}

如果有更简单的方法可以从 Java 中检测 System.out 是否启用了 ansi。如果可以的话,我想使用它。

如果我现在坚持使用 jansi 库,则失败 - 我如何正确检测 System.out 是否启用了 ansi?

4

0 回答 0