クックパッド開発者ブログスマートフォン用の表示で見るクックパッド開発者ブログ2015-02-26データがどのように更新されてきたのか追跡するこんにちは。みなさんは、異常なデータを見つけたが、どうしてそのような状態になったのか追跡できず困ったという経験はないでしょうか。今回は、そんなときにクックパッドで利用されているAuditログについてご紹介します。AuditログとはクックパッドでのAuditログは特定のデータレコードに対して発生したイベントをコンテキストとともに記録するものです。一般的に監査ログ、証跡ログといったものがありますが、それらとは多少異なっています。ここでのイベントとは、あるデータレコードが作成された更新・変更された削除されたといったものです。それ以外にもログインした、ログアウトした、セキュアな情報が閲覧された、といったイベントも含まれています。コンテキストは以下のようなものを記録します。異常なデータレコードがあった場合に、どうしてそのような状態になったのかを追跡することができます。リクエストがあって正常に更新されたが、その後バッチ処理が意図しない挙動をして更新している、といったような調査ができるのです。カスタマーサポートのアシストユーザーの操作履歴を調べて、この設定変更をしているのが問題だ、といったようなアシストができます。その操作がユーザー自身が行ったのか、サポートスタッフが管理ツールから行ったのかといったことも確認できます。Auditログをどのストレージに保存するかAuditログを実装する上で悩ましいポイントの一つがストレージの選定です。クエリを考えてジョブキューになげてMapReduceを待つことはできません。いうのも電話中に数分待つことができないためです。Engineもなく、より即応性の高いものが必要でした。行動ログなどと比べると、個別のケースを追いかけるわけですから抽出条件が非常に多岐にわたります。調査の際にはいろいろな切り口でトライアンドエラーで調査するケースが多いです。これらのことを考えると、RDBMSのようなインターフェイスのほうが取り扱いはしやすそうです。Redshiftがぴったりでした。やってイベントのコンテキスト情報を記録するかAuditログの実装する上でもう一つ悩ましいポイントが、どのようにコンテキスト情報を集めるかという点です。データレコードを中心においているのですから、当然発火する場所はモデルの処理ということになります。ところがモデルは一般的にHTTPリクエストの内容を知りません。頑張ってコントローラーからパラメータを引き回すこともできそうですが、実装が辛そうです。そこでスレッドローカル変数としてコンテキストを保存する方法を採用しています。このロギング処理については、各サービス担当者が簡単に利用できるように共通ログインターフェイスを用意しています。社内ではFiglogと呼ばれています。...endあるいは、モデルにincludeせずにconfigとして設定もできます。recipe)これだけで、create/update/delete時に、スキーマ、テーブル、レコードIDとどのカラムが変更されたかが記録されます。ActiveRecord以外にもデータソースラッパーを指定でき、Redisなどを使っていても同じインターフェイスで利用できます。先程のコンテキストを取得するメソッドが用意されており、通常はコントローラーの共通フィルタでセットするようにします。endendこれでそのリクエストにまつわるコンテキストが保存され、以降使いまわせるようになります。この処理が前回のコンテキストをリセットする処理も兼ねています。ログインユーザーの情報は、コントローラのcurrent_userメソッドからFiglogが自動で取得しその情報を記録します。そのため利用する場合はcurrent_userを実装する必要があります。pros/consこのAuditログのような機能を実装する場合、シンプルなものとしては変更履歴レコードを作る方法があります。いった手法と比べると、メリットとして抜け漏れが発生しづらいモデルの変更操作で自動取得するため、あるケースだけログ処理が抜けていた、ということが発生しづらい導入コストが低い利用者がログフォーマットなどを意識する必要がなく、簡単に利用できるサービスごとの独自仕様が発生しないサービスを横断した検索がしやすいといった点があげられます。デメリットは、ログが記録されていることを保証しきれないという点です。同じRDBでログと対象データを管理していれば、トランザクションで一貫性を保つことも可能なはずです。モデルのコールバックによって処理され、実データは非同期に保存されるため、同じように一貫性を保つことができません。共通ログ基盤FiglogここまでAuditログの話をしてきましたが、Figlogは社内では共通ログ基盤という位置づけです。Auditログ以外にもPVログや行動ログなど様々なログに対応しています。Dataを利用しており、ストレージとしては全く別物です。インターフェイスを共通にすることで、開発者の学習・導入コストを減らし簡単に扱えるようにする狙いがあります。something')ここで先ほどのコンテキストが既に保存されていれば、自動でそれも記録されます。そのためAuditログ同様にロジックの深い部分までログパラメータを引き回す必要がありません。まとめクックパッドでのログの活用事例としてAuditログと共通ログ基盤をご紹介しました。Figlogは技術的に難しいことをやっている訳ではありません。ユースケースとログストレージの間をつなぐビジネスロジックに近い存在です。いった性質からOSS化は難しいものの、インターフェイスなどの参考になれば幸いです。年が経ちましたR&D(研究開発部)部長の原島です。広告配信を支えるリアルタイムログ集計基盤こんにちは。会員事業部の三吉です。技術部の青木峰郎です。使ったセキュリティログ検索基盤の構築サービス特性にあった検索システムの設計戦略クックパッド採用説明会「クックパッドはサービスの作り手を採用したいんです。/*}*/スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。