Windows 10でGroovy v3、Java 11を使用して、System.outがAnsi対応の場合、カラー出力でLogbackを使用しようとしています。
コンソールの std out が ansi 対応かどうかの検出に基づいて、logback.groovy 構成をアペンダー形式の文字列に切り替えたいと考えています。
オンラインで簡単な答えを見つけようとしましたが、管理できませんでした。ただし、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 ライブラリで、このような追加のコードを見つけました。これは、モード == 0 の場合に false (つまり、ansi が有効になっていない) であることを示唆する VTmode の設定を示しています。サンプルコードでは、まだコンソールを強制的に設定しようとはしていません。
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();
}
System.out が ansi 対応かどうかを一般的に Java 内から検出する簡単な方法がある場合。できればそれを使いたい。
今のところjansiライブラリに固執すると失敗します-System.outがansi対応かどうかを正しく検出するにはどうすればよいですか?