Linux
Terminal
log
monitoring
color

ターミナル出力を色づけするツールを作ってみた

はじめに

先日こちらの記事を見てとても便利そうだったので、いろいろ機能追加してツールにしてみました。

https://github.com/dalance/pipecolor

使い方

こんな感じでパイプでつないで使います。

$ tail -f hoge.log | pipecolor

ファイル指定でcat相当の動作をします。

$ pipecolor hoge.log

さらにLinux限定ですがPID指定で実行中のプロセスから出力を取ってくることもできます。

$ pipecolor -p 10000

また、出力が端末かファイルかは判定しているので、デフォルトではファイルへのリダイレクト時には色付けしません。

$ tail -f hoge.log | pipecolor > no_color.log # no_color.logは色付けなし
$ tail -f hoge.log | pipecolor --mode always > color.log # color.logは色付けあり

動作デモはこんな感じです。
(INFO行を緑、ERROR行を赤に色付けしてみました)

pipecolor.gif

インストール

Releaseから最新のバイナリをダウンロードしてパスの通ったところに置いてください。
Rustで書かれているので環境構築済みの方は以下でもOKです。

$ cargo install pipecolor

設定

カラーリングの設定ファイルを用意します。デフォルトでは~/.pipecolor.tomlを読みます。
また、--configオプションでパス指定も可能です。

シンプルな設定

[[lines]]
    pat   = "ERROR.*"
    colors = ["Red"]
    tokens = []

patにマッチさせる正規表現を、colorsに色を指定します。
この場合正規表現にマッチした部分全体がRedになります。

グルーピングによる色分け

[[lines]]
    pat   = "(ERROR).*"
    colors = ["Red", "LightRed"]
    tokens = []

正規表現ではグルーピング指定ができて、各グループの色はcolorsの2つ目以降に書きます。
(1つ目の色はどのグループでもない部分です)
この場合はERRORLightRed.*の部分がRedです。

複数の色付け設定

[[lines]]
    pat   = "(ERROR).*"
    colors = ["Red", "LightRed"]
    tokens = []
[[lines]]
    pat   = "(INFO).*"
    colors = ["Green", "LightGreen"]
    tokens = []

linesは複数設定出来ます。この設定は上の動作デモで使った「ERRORが赤、INFOが緑」のものです。

特定文字列のハイライト

マッチした行のうちさらに特定の文字列だけハイライトすることもできます。

[[lines]]
    pat  = "^(.*?) .*? .*? \\[(.*?)\\] \".*?\" .*? .*? \".*?\" \"(.*?)\""
    colors = ["White", "LightGreen", "LightBlue", "Green"]
    [[lines.tokens]]
        pat   = "GET"
        colors = ["LightCyan"]
    [[lines.tokens]]
        pat   = "POST"
        colors = ["LightYellow"]
    [[lines.tokens]]
        pat   = "HEAD"
        colors = ["LightMagenta"]       

これはApacheのログを想定した設定です。GET/POST/HEADに対してそれぞれ色付けしています。

access_log.png

色指定

使える色は今のところ以下です。

Usable color
Black Blue Cyan Default Green
LightBlack LightBlue LightCyan LightGreen LightMagenta
LightRed LightWhite LightYellow Magenta Red
White Yellow