Log目次

【Rails】監査ログの実装について

作成日 2026-08-02更新日 2026-08-02

はじめに

仕事で監査ログを実装する時があるので、監査ログについて自分の考えをまとめてみた

監査ログとは

いつ、誰が、何を操作したかがわかるように記録するデータ

フォーマットは変更がわかればなんでもいいと思うが大事な事はもれなく記録されていること

「何を」の部分は、操作があった事実だけを残すのか、変更前後の値(diff)まで残すのかで設計が変わってくる

記録したくない情報があるならカラム単位で記録対象から除外する、値をマスキングするといった設計もあわせて必要になる

また、記録した監査ログ自体が後から改ざん・削除できてしまうと意味がないので、通常のログ以上に改ざん・削除されない仕組みになっているかも重要なポイントだと思う

具体的には以下のようなシステム・シーンで使われることが多い

いずれも「後から誰が何をしたか説明できる必要がある」という点が共通していて、法令や社内規定で保存が義務付けられているケースも多い

実装方法 アプリケーション側で書く

アプリケーション側で明示的に監査ログを書き込む処理を作る

railsだとModelのコールバックで書き込むことが多いかもしれない。paper_trailauditedのようなgemを使うと、この仕組みを自前で実装しなくても導入できる

注意点

実装方法 DBのトリガーで書く

DBのトリガーをINSERT,UPDATE,DELETEごとに作成して、監査ログのテーブルに書き込む方法 DB側で行うので、アプリケーション側の実装漏れによる監査ログの作成漏れは起きにくい

テーブル設計はテーブル毎に監査ログ用のテーブルを作成する方法もあると思うが、テーブル追加する毎に増えることになるので、PostgreSQLのAudit trigger 91plusのように、全テーブル共通の1つの監査テーブルに集約する設計の方が個人的には良いと思う

注意点

まとめ

監査ログにとって一番大事なのは「もれなく記録されていること」だと思っているので、通常のDML操作をアプリケーション以外の経路も含めて漏れにくく記録したいなら、DBのトリガーが有効だと思う