Webアプリケーションのログに関するいくつかの考察

こんにちは、はてなでWebアプリケーションエンジニアをやっている id:polamjag です。
最近のはてなでは、若手エンジニアを中心として、いろいろな技術を見つめ直すワーキンググループをやっています。先日、id:onk も「デプロイ今昔」という記事を書きましたが、このエントリーはそのシリーズの続きで、ワーキンググループの「ログ」の回で議論したこと・話題になったことをまとめました。

Web開発におけるログを見つめ直す

Webサービス(Webアプリケーション)の運用には、多種多様なログがついてまわります。多くのミドルウェアは何もしなくてもそれなりの量のログを出力しますし、クラウド上のマネージドサービスも然りです。行動ログのようなものを意識的に記録することも多いでしょう。
弊社の開発チームでは、OSやミドルウェアのログから行動ログのようなものまで、幅広く扱うことが求められています。
このような文脈を踏まえ、ワーキンググループでは次のような話をしました。
  1. 自分たちが触れているログを思いつくだけ列挙する
  2. それらを用途や目的で分類してみる
  3. 何のためにログを扱っているのか見つめ直してみる
列挙したログの種類をここで全部書き上げることはしませんが、いわゆるアプリケーションログにはじまり、ミドルウェア・OS・クラウド上のマネージドサービスのログなどが挙がりました。

ログを4つの目的で分類する

次に、その用途も合わせて思い出せるだけ列挙し、さらにその上流にある目的などの軸で分類を試みました。その結果、Webアプリケーションにおいてログを出力する目的は、大きく分けて4つあるだろうという話になりました。
  • 監視 ... システム障害やパフォーマンスの低下が発生したときに気付ける
  • 調査 ... エラーやパフォーマンスの低下の原因がわかる
  • 分析 ... 未知の情報を探索したい
  • 義務 ... 法務観点などから保存することが定められているログ
これらのうち、義務以外の3項目についてさらに抽象化を試みました。そもそも実現したいのは「よりよいサービスを提供する」ため、「システムを信頼性高く、なるべく低コストに運用したい」というようなことであるはずです。
これは、以下のようにエンジニアが実施することと、それと関連したデータ指標に分解できるのではないか、という話になりました。
実現したいこと 実施すること データ指標
よりよいサービスを提供 データ分析 KGI・KPI
信頼性が高いサービスを低コストで運用 Site Reliability Engineering SLIなど
これらを支えるデータ指標の多くが、何らかのログから生み出されることは、疑いようのない事実でしょう。ビジネス的な文脈においても、システム運用的な文脈においても、データドリブンな意思決定をしていくべきというプラクティスの存在感は増していると思います。
いずれにせよ「データドリブンな意思決定を支えるためにログがある」と言い切ってしまってよいのではないでしょうか。

目的ごとに求められる取り扱いの要求水準

さらに、ログの取り扱いに求められる要求水準が、上記に挙げた4つの目的によって異なることも議論しました。例えば、次のような要件が考えられます。
  • サンプリングしてもよいか、あるいは取りこぼしが発生することが許されるか
  • 収集・集計がリアルタイムに処理される必要があるか(遅延がどれくらい許容されるか)
  • 集計を前提としたログであれば集計後の元データも保存しておく必要があるか、未加工の形で残す必要があるか
すべてのログを遅延なく完全な形で保存するパイプラインを運用できるなら、それに越したことはありません。しかし、それは必ずしも現実的ではないでしょう。
そのため、それぞれの要件について、どれくらい満たせていれば十分なのかを目的ごとに整理したところ、以下のような結論になりました。
目的 取りこぼし リアルタイム性 データの扱い
監視 監視対象による 最大 メトリックを計算するのに用いた元データや生ログは捨ててもかまわない
調査 取りこぼしがあってはならない 高い 必要な期間保存しておく
分析 精度が保てる範囲でサンプリングしてよい 必須ではない 必要な期間保存しておく
義務 取りこぼしがあってはならない 低い 定められた期間保存しておく必要がある
もっとも、ここで挙げた要件だけでどんな種類のログの取り扱いも定義できるということはなく*1、ログの種類ごとにコストとのトレードオフも考慮しながら議論する必要があると思います。
† 例えば「1行でもエラーログが出たら知りたい」という要件であれば、取りこぼしてはいけない。
‡ 要件によるが、ここに挙げた要求であることが多いのではないか。

いまどきのログフォーマットについて

やや余談気味ではありますが、上記の目的によらない一般的な話題として、より機械的に扱いやすいログフォーマットのほうがベターであることも再確認しました。
近年、ログを扱いたいときの選択肢として第一に挙がるのは、GoogleのBigQueryAmazon RedshiftAmazon Athenaなどに代表されるクラウド上のマネージドサービスが多いでしょう。ログフォーマットを選定する上で、それらのサービスや周辺ツールによるサポート状況は、とても重要なファクターになっていると思います。
弊社では、伝統的にサーバのログフォーマットとして、LTSV(Labeled Tab-separated Values)を用いてきた歴史があります。一方、私が知る限り、この手のサービスにおけるLTSVのサポートは心細いことが多いと思います*2
実際に弊社においても、クラウドネイティブ的な考え方を前提に構築された近年のシステムでは、ログのフォーマットとしてLTSVではなくJSONを採用するケースがほとんどです。

まとめ:どう実装するかを模索していく

このように、ログを取り扱う最大の目的は、データドリブンな意思決定を支えることであり、大別すると「ビジネス的な要求」と「システムの運用的な要求」が存在することを確認しました。また、それを実装・運用するうえで、要求・目的ごとに求められる要件が異なることも確認しました。
最後に、ここまで書いたことを実際にどう実装していくかという話ですが、はてなではまだまだそれぞれのチームで模索する段階にあるというのが正直なところです。エンジニア間でも、ログやデータ分析に関心があるメンバーを中心に、チームを超えた情報交換を行いながらさまざまな試みを進めており、社内でもホットなトピックの一つになっていると感じています。
具体的な取り組みは、このブログでも次のように随時アウトプットしていきます。
*1:具体的には暗号化などが必須であるといったこともあるでしょう
*2:もちろん全く扱えないということはなく、実際にはたとえばAmazon AthenaでLTSV形式のログを調査するようなオペレーションを行うこともあります