ログの回転は予測可能な形で壊れる。三つの構成要素がそれぞれ自分がファイルの所有者だと考え、その結果、新しいファイルが空のまま古い回転済みログが増え続ける。デーモンはディスクリプタを保持し、logrotate はパスを改名し、rsyslog はまったく別の場所に書き込む。山にルールをひとつ足す前に、書き手をひとつ、回転役をひとつ決めること。以下のチェックリストがこの順序で進むのは、以降のすべての手順がそれに依存するからだ。

ファイルを書くのは誰かを決める

正当な設計はふたつある。ひとつは VPN プロセスが自身の log または log-append オプションでファイルを直接書く。もうひとつはシステムロガーに記録を送り、rsyslog または journald が置き場所を決める。

これは層ではなく代替案だ。両方を有効にしたホストは食い違うふたつのファイルを抱え、読んでいるほうが古いことが多い。経路を意識して選び、その後でもう一方の書き手を外す。

何かを変える前に、unit ファイルを上書きしうる drop-in も含めて、サービスの実効設定を読むこと。編集したプロファイルにあるディレクティブは、それが 実行中のプロセスが読み込んだもの だという証拠にはならない。unit をプロセスの引数と、次に実際に開いたファイルと照合する。

狭いフィルターのためにデーモンに名前を与える

syslog 経路では、デーモンに固有の識別子を与えてそれで絞り込む。この VPN インスタンスのプログラム名に一致するルールなら、保存ポリシーが別のものに属する共有ファイルから記録を切り離せる。

狭いルールは次の問いにも答えられるようにする。この行を出したのはどのサービスか。VPN という語を含むすべてに一致するフィルターは、ふたつ目のトンネルの通信も喜んで集め、両方をぼやけさせる。unit がロガーに渡す厳密な識別子に合わせること。

記録が既定の宛先にも流れ込まないよう、アクションの後でルールを閉じる。ふたつのファイルに同じ行が並ぶのはロギングの不具合に見えるが、実体は止め忘れだ。そのひとつの抜けは、保存ポリシーのディスク費用も二倍にする。

ディスクリプタを失わずに回転させる

デーモンがファイルを書いている場合、logrotate はパスを改名するがプロセスは開いたディスクリプタを保持し続ける。新しい記録は改名後のファイルに入り続け、何かがプロセスを促して元のパスを開き直させるまで続く。だから回転が成功したように見えて、新しいファイルが空のままになる。

解決策は、サービスの文書化された再読み込みや再起動の挙動を起こす postrotate アクションだ。ロガーにシグナルを送るのはまったく別のアクションで、自分のファイルを保持するデーモンには何の効果もない。

再オープンが不可能な場合の代替が copytruncate で、ファイルをコピーし、その場で切り詰める。ディスクリプタは有効なままだが、コピーと切り詰めの間に書かれたものは失われるので、解決ではなく取引である。負荷が高いと、その隙間が捕まえたい障害そのものを飲み込むことがある。

ファイルごとにどちらか一方を選び、選択を書き残すこと。同じパスで混ぜると、後から原因をたどるのが非常に難しい隙間が生まれる。ひとつのディレクトリで両方のパターンを見つけた読み手は、どちらが正なのか判断できない。

保存期間はインシデントの窓から決める

保存期間、圧縮、最大サイズは、実際にどこまで遡って調べるかから導くべきだ。圧縮とサイズ上限を伴う七日間の窓は多くの配備で妥当な出発点であり、チュートリアルからコピーした数字はそうではない。

ポリシーは一か所に置く。logrotate がファイルを回転し、rsyslog もそれを回転させると、ふたつ目の回転が勝ち、ひとつ目の命名規則は乱雑さとして残る。所有者を決め、もう一方の回転を止め、その判断をポリシーのそばに書き留める。

rsyslog のドキュメント はルーティングとアクションのモデルを扱っており、デーモン自身のロギングオプションについては OpenVPN サービスのドキュメントが引き続き拠り所となる。どちらもあなたの代わりに保存ポリシーを決めはしない。

回転を一回と新しいイベントをひとつ試す

回転を一度だけ強制し、その後に認証失敗のような新しいイベントをひとつ起こす。新しい記録が新しいファイルに現れ、古いファイルの増加が止まったことを確認する。

新しいファイルの権限も確認すること。別の所有者で作り直す回転は、次の書き込みで書き手を壊し、クラッシュに見える隙間を生む。離れる前に所有者とモードをサービスアカウントと比べる。続いて圧縮アーカイブが読めることを確かめる。誰も開けないアーカイブは保存ではない。古いファイルの最新記録をざっと読めば、圧縮と権限の両方が証明できる。

最後に各手順の所有者を記録する。どの構成要素が書き、どれが回転させ、保存ポリシーがどこにあるのか。その記録があるからこそ、次のロギング障害はどの層が行を落としたかを推測する半日ではなく、五分の確認になる。

関連記事