着色の問題

着色の問題

トラブルシューティングを簡単にするために、wim、less、またはその他の手段を使用して大容量(〜6000行)のログファイルを表示する方法を変更したいと思います。

errorログ内の特定の行(...など)を強調表示したり、パターンに応じて他の行を非表示にしたいです。warninginfo

どのツールを使用できますか?シェルスクリプトだけが必要ですか?重要なことは、プロセスの後に検索操作を実行するためにless、vimなどを使用して出力を読み取ることができることです。

編集:ログの小さな部分:

2016/10/25 12:19:24.403355 INFO <ServiceManager.cpp#2614 TID#3> Security object has NOT been parsed
2016/10/25 12:19:24.403369 INFO <ServiceManager.cpp#1263 TID#3> Service object sequence started
2016/10/25 12:19:24.403372 DBG <ServiceManager.cpp#1276 TID#3> preinvoke succeeded

答え1

awkValentin B.のソリューションのようなものに基づいたシェルスクリプトをお勧めします。

$ cat colorize
awk '
function color(c,s) {
        printf("\033[%dm%s\033[0m\n",30+c,s)
}
/error/ {color(1,$0);next}
/success/ {color(2,$0);next}
/warning/ {color(3,$0);next}
/INFO/ {color(4,$0);next}
/DBG/ {color(5,$0);next}
{print}
' $1

カラー出力を対話形式で表示するには、lessrawモードを使用します。たとえば、次のようになります。

colorize mylog.txt | less -R

答え2

awk他の答えで述べたように、ツールは間違いなく最初に到達する必要があります。

しかし、長期的に使用できる唯一のツールではありません。

ALランバートlogtool事後処理ログファイル用に特別に設計されており、正規表現でいっぱいのファイルを13色のそれぞれに割り当てることができる複雑な(悲しいことに文書化が不足している)構成システムを備えています。

cat*.logロギングツール|

TAI64Nタイムスタンプを含むログを理解する機能が特徴です。

これを行うには、次を追加します。

着色の問題

残念ながら、これらのツールのいくつかは非常に間違ったシェーディング効果を持っています。 terminfoで setaf/ etcを使用する代わりに、制御シーケンスをハードワイヤーします。setab

さらに、シェーディングはより微妙な理由でトリッキーであり、これを正しく処理するシェーディングプログラムはほとんどありません。完全に正確にするには、シェーダは自動マージンとDEC VTを処理する必要があります。改行待ちメカニズム、私はどのシェーダもこのようなことをするのを見たことがありません。 GNUにはgrepこの分野でかなり有名なカラーバグがありますが、これは単なる問題ではありませんgrep

追加読書

答え3

確認後、端末で直接使用してカラーテキストを出力できますawk。提供された例を使用すると、displayLog.awk次のコードを含むawkスクリプトファイルを生成できます。

# output INFO lines in cyan
$3 == "INFO" {
    print "\033[36m"$0"\033[0m"
    next
}

# don't display DBG lines
$3 == "DBG" {
    next
}

# output WARNING lines in bright yellow
$3 == "WARNING" {
    print "\033[1;33m"$0"\033[0m"
    next
}

# output ERROR lines in bright red
$3 == "ERROR" {
    print "\033[1;31m"$0"\033[0m"
    next
}

# If you want to skip all other lines, comment next line
{print}

次に、きれいな端末ウィンドウを開き、ディスプレイが制限されていないことを確認し(一度に6000行すべてを表示できます)、次のように使用します。

$ awk -f displayLog.awk log.txt

またはユーザーのようにエリヤ・グレー彼のソリューションで提案されているように生モードで送信しますless

$ awk -f displayLog.awk log.txt | less -R

これだけで十分です!私の答えのサンプルコードに基づいて、色と表示する行を調整できますawk。カラーコーディングの詳細ここ

編集する

完全な行ではなく単一の単語にのみ色を付けたい場合(たとえば、ERRORが赤で表示されるようにするには)、次の手順を実行します。

$3 == "ERROR" {
    $3 = "\033[1;31m"$3"\033[0m"
    print
    next
}

答え4

パターン(エラー、警告、情報など)に基づいてログ内の特定の行を強調表示するには、次のコマンドを使用します。

grep -rn "pattern" <logfile>

このコマンドは、上記のパターンでログファイルの全行をすべて表示します。

関連情報