如果 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?