问题描述
如果 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?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)