1

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対応かどうかを正しく検出するにはどうすればよいですか?

4

0 に答える 0