フランス拠点のアプリは現地語のままログを出していて、障害のたびに「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 条评论
还没有评论,写下第一条。