フランス拠点のアプリを触っていたとき、障害時に現地運用チームが送ってくるログが「フランス語のメッセージ + 現地時刻」で、こちらの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 条评论
还没有评论,写下第一条。