フランス拠点の障害対応、awkで現地語ログから必要な行だけ英語化して抜く手順

这篇内容暂时只有 日本語 版本,以下是原文。

フランス拠点のアプリを触っていたとき、障害時に現地運用チームが送ってくるログが「フランス語のメッセージ + 現地時刻」で、こちらのgrepがほぼ効かない状態だった。対象はJavaアプリで、1日あたり数十万行、障害時は3ノード分を突き合わせる必要があった。ログは/var/log/appli/application.logに2024-06-12 14:32:07,123 ERREUR ...の形式で出ていた。

まずやったのは、その場で使える小さな抽出スクリプト。英語キーに完全に揃えるのではなく、障害種別だけを英語に寄せて、後は現地語のまま残した。

awk '
  /ERREUR|AVERTISSEMENT|EXCEPTION/ {
    msg=$0
    if (msg ~ /ERREUR/)      key="ERROR"
    else if (msg ~ /AVERTISSEMENT/) key="WARN"
    else                     key="EXCEPTION"
    print key "\t" msg
  }
' application.log > /tmp/keys.tsv

これを3ノード分流して、cut -f1で件数を見てから、該当時刻の前後をgrep -nで開く。時刻は現地のまま使った。UTCに寄せると、現地チームとの電話中の会話とずれるため。

この方法の利点は、既存のログ形式を一切変えずに、こちらの検索キーだけを英語にできること。ただし、現地語のメッセージ本文は翻訳しないので、根本原因の判断は現地チームに聞く必要がある。あと、ERREURとAVERTISSEMENTが同じ行に両方出るようなログでは、先にマッチした方だけが残る。自分はこれで一度、警告とエラーの混在行を見落とした。

境界条件として、複数行にまたがるスタックトレースはこのawkでは1行目しか拾えない。その場合はgrep -A 20で前後を開く運用にしている。また、ログがgzip圧縮されている場合はzgrepではなく一度展開してから流す。圧縮のままawkに渡すと文字化けした経験がある。

同じように、現地語ログを英語キーで追っている人がいたら、どの程度まで翻訳しているか聞いてみたい。

0
赞同度 100% · 0 条评论 · 1 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。