Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

アプリケーションを開発運用しているエンジニアの方はほぼ毎日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'

1.png

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

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'

2.png

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

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

3.png

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

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

4.png

使い方は

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

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

おわりに

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

mizutsu
2008年に中小企業のソフトハウスに入社して技術者としてのキャリアをスタート。会社員(08年10月-17年12月)→フリーランス(18年1月-20年3月)→会社員(20年4月-)という経歴。現在はPHPで作られたWEBシステムの開発・運用をしています。経験が長い言語はPHP、javascript、Bash。テキストエディタはVim派。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした