フランス拠点の障害対応、rsyslogの現地語メッセージを英語キーで検索する手順

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

フランス拠点のアプリは現地語のままログを出していて、障害のたびに「Erreur」「échec」でgrepしていました。ところが同じ事象でも開発側は英語で「timeout」「connection refused」と書き、検索語が噛み合わない。ログは1日あたり約40万行、rsyslog経由で集約していて、現地語のままだと一次切り分けに毎回20分ほどかかっていました。

やったのはrsyslogのテンプレートで英語キーを先頭に付けるだけです。アプリ側は触らず、受信時にタグを足します。

template(name="frkey" type="string"
  string="%syslogtag% key=%$!key% %msg%\n")
set $.key = "unknown";
if ($msg contains "délai") then set $.key = "timeout";
if ($msg contains "refus") then set $.key = "connection_refused";
action(type="omfile" dynaFile="frlog" template="frkey")

キーは英語の固定語に寄せ、現地語の本文はそのまま残しました。検索はkey=timeoutで引き、本文は必要なら現地語のまま読む。翻訳を捨てないのが要点で、英語に置き換えると現地の運用担当が読めなくなります。

仕組みとしては受信時の文字列一致なので、アプリの文言が変わればキーがunknownに落ちます。実際、échec de connexionがconnexion échouéeに変わった日にキーが全部外れ、気づいたのは翌朝でした。対策としてキーがunknownの件数を日次で数え、前日比で増えたら通知するようにしています。あとアクセント記号はNFDで届くことがあり、délaiの一致が外れたこともありました。照合前に正規化するか、記号なしの部分文字列で当てるかは悩みどころで、うちは正規化を選びましたが、正規化のコストは行数に比例します。

この手順が効かないのは、そもそも本文に現地語が出ない構成のときと、複数行にまたがるスタックトレースです。後者は1行目しかキーが付かず、続きの行はunknownになります。皆さんのところでは、現地語ログのキー付けをアプリ側でやっていますか、それとも集約側でやっていますか。

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

0 条评论

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

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