[Terminal] tailでのlog監視時にErrorやWarningの行の色を変えてエラーに気づきやすくする


はじめに

アプリケーションを開発運用しているエンジニアの方はほぼ毎日logを見ていると思います。
監視の方法としてはlessやtailで監視されているのではないかと思います。
私はtailを使うことが多いです。
そして漠然と監視をするのではなく、

  • Fatal : 文字:赤
  • Error : 文字:赤
  • Warning : 文字:黄

とカラーリングさせることで監視しやすくしています。
重要なlogを見落とさないためのターミナルの表示のカスタマイズ方法を紹介します。

ANSI escape sequencesをperlコマンドで使用する

ANSI escape sequencesを使うとターミナルの表示をカスタマイズできます。
下記のようにtailしたものをパイプでperlコマンドに投げれば文字がカラーリング表示されます。

$ tail -f dev.log | perl -pe 's/.*ERR.*/\033\[0;31m$&\033\[0m/gi'

ただコマンドが長くて面倒臭いですね。私は頭が悪いのでカラーコードが覚えられません。。。
なので違うやり方をとっています。

PerlのTerm::ANSIColorを使ったスクリプトを作る

私はPerlのTerm::ANSIColorを使ったスクリプトを作成してコマンドで利用しています。

私が作成したSampleスクリプトを載せておきます。
(改善の余地があると思いますので、好きに改善してください。)

rcg.pl
#!/usr/bin/perl                                                                                                                                                                                                                       
use strict;
use warnings;
use utf8;

# @see https://perldoc.perl.org/Term/ANSIColor.html
use Term::ANSIColor qw(:constants);

my %setting = (); 
my $reset = RESET;
my @regexList = (); 

# check arguments
my $isInvalid = (@ARGV == 0) || ($ARGV[0] eq '') || (@ARGV % 2 != 0); 
if ($isInvalid) {
    &printErrMsg();
    exit 1;
}

# preparation
while (my $regex = shift) {
    my $color = shift;
    my $isInvalid = ($regex eq '') || ($color eq '');
    if ($isInvalid) {
        &printErrMsg();
        exit 1;
    }   
    $setting{$regex} = eval($color);
    push(@regexList, $regex);
}

# operation
while(<>) {
    foreach my $regex(@regexList) {
        my $color = $setting{$regex};
        s/($regex)/${color}${1}${reset}/g;
    }   
    print;
}

##
# function for use Term::ANSIColor
#
# @param string $msg message
##
sub printMsgOnRed($) {
    my ($msg) = @_;
    print BOLD WHITE ON_RED ${msg}, RESET, "\n";
}

##
# function for output error message
##
sub printErrMsg() {
    &printMsgOnRed("Argument is incorrect. Please check again.");
    &printMsgOnRed("Usage: perl rcg.pl [regex] [color] [regex] [color] ...");
    &printMsgOnRed("e.g ) tail -f /usr/local/var/log/error.log | perl rcg.pl '.*ERR.*' 'BOLD WHITE ON_RED'");
}

exit 0;  

使い方はこんな感じです。カラーコードよりも直感的ですよね。

$ tail -f dev.log | perl rcg.pl '.*ERR.*' 'RED'

また引数を変えるとこんな感じにもできます。

$ tail -f dev.log | perl rcg.pl '.*ERR.*' 'BOLD WHITE ON_RED'

ERRだけでなくDEBUGをしていするなど複数もいけちゃいます。

$ tail -f dev.log | perl rcg.pl '.*ERR.*' 'BOLD WHITE ON_RED' '.*DEBUG.*' 'BOLD GREEN'

使い方は

perl rcg.pl [regex] [color] [regex] [color] ...

です。colorにはTerm::ANSIColorの定数が使えるようになっていますので、リンク先のページのConstant Interfaceを参照してください。

おわりに

log監視の工夫が簡単にできますのでぜひ試してみてください。
どなたかのお役に立てれば幸いです。