12.1 ログをめぐる、出力の仕組みの変化

ログの書き方などを紹介する前に、アプリケーションの外側の世界を整理しておきます。

これまでは syslog にデータを送ったり、ファイルにログを出力した上で、ログローテーションを行ってログファイルを定期的にファイルサーバーに集約するという手法が一般的でした。アプリケーションはそれぞれ自前で syslog にログを送信したり、ログファイルに書き出したりしつつ、ログローテーションも自前で行うなど、ログを集約する処理の多くをアプリケーションで使う比較的リッチな機能を備えたログライブラリで実装していました。システムに問題が起きたときのアラートなどは、こうして集められたログを監視することで実現されてきました。

ビッグデータが話題になったのはかれこれもう10年以上前ですが、HadoopやSparkなどのデータ分析に利用可能なシステムが出てきたり、ログを収集して分析を支援するクラウドサービスやSaaSなどが続々と登場し、データ分析基盤を利用しやすくなりました。これらのサービスにデータを格納することを念頭に、 構造化ログ が用いられるようになりました。

ログの収集方法も多様になりました。たとえばアプリケーションからはFluentdやLogstashなどのログ収集エージェントを経由してファイルストレージにJSON、LTSV 1 などのフォーマットでデータを格納した後に、バッチでデータ分析基盤にデータを入れる方法なども広く使われています。最初の収集エージェントは、今まで通りログローテートされたファイルを読み込んで転送することもあれば、syslogプロトコルでアプリケーションからデータを受け取る方法もありますし、アプリケーション自身にFluentdやLogstashプロトコルでログを送信する機能を持たせる方法もあります。収集エージェントの設定をログ形式に合わせてカスタマイズすることで「構造化されたログデータ」として扱えるようになりました。構造化ログについては後述します。 ...