web-dev-qa-db-ja.com

ログバック:実際の端末にログインする場合にのみ色付きの出力を使用します

ログバック構成には、次の行があります。

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
    <pattern>%highlight(...) %msg%n</pattern>
  </encoder>
  <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>WARN</level>
  </filter>
</appender>

これにより、警告とエラーがターミナルに色付きで表示されますが、メインログファイルにはさらに多くの情報が含まれる可能性があります。 INFOおよびDEBUGレベル。

通常、これは問題なく機能します。しかし、Emacsやその他の「実際には端末ではない」プログラムから実行すると、カラーリングコマンドはASCIIエスケープシーケンス、例:^[[31m警告の強調表示用。実際の端末に接続したときに、LogbackでANSIカラーリングのみを使用することはどういうわけか可能ですか?

11
doublep

ここには2つの問題があります。

色を使うべきかどうかを検出する方法

これは些細なことではありません。 この回答 が示唆しているように、 isatty へのJNI呼び出しを使用して、端末に接続しているかどうかを検出できますが、優先度の低い機能には多くの作業が必要です。

ログバックで条件付きで色を使用する方法

これは実際には非常に簡単です( 公式ドキュメント )。これを機能させるには janino が必要であることを忘れないでください。

<configuration>
    <appender name="COLOR" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%date] %highlight([%level]) [%logger{10} %file:%line] %msg%n</pattern>
            <!--             ^^^^^^^^^^ -->
        </encoder>
    </appender>
    <appender name="NOCOLOR" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%date] [%level] [%logger{10} %file:%line] %msg%n</pattern>
        </encoder>
    </appender>
    <root level="debug">
        <!-- to use enable this mode pass -Dcolor to jvm -->
        <if condition='isDefined("color")'>
            <then>
                    <appender-ref ref="COLOR"/>
            </then>
            <else>
                    <appender-ref ref="NOCOLOR"/>
            </else>
        </if>
    </root>
</configuration>
20
joozek