【実録ドキュメント】そのログ本当に必要ですか?:現場から学ぶWebアプリ開発のトラブルハック(3)(2/2 ページ)
本連載は、現場でのエンジニアの経験から得られた、APサーバをベースとしたWebアプリ開発における注意点やノウハウについて解説するハック集である。現在起きているトラブルの解決や、今後の開発の参考として大いに活用していただきたい。(編集部)
続いて、ソースを洗う
続いて、アプリケーションのソースを確認する。すべてのソースコードに目を通す時間はないので、適当に2、3のクラスをピックアップして確認したところ、ログを出力するコードがリスト2のようにif文で囲まれていなかった。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
■if文で不必要なログ出力を避ける
これでは、ログレベルを変更したとき、出力する必要のないログメッセージ生成処理が行われてしまう。ログレベルを変更してもパフォーマンスの低下を招いてしまう。
通常、パフォーマンスを考慮しリスト3のように、書き込み処理をif文で囲むことを推奨する。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
■推理【3】ログレベルはdebugのみ?
さらに気になった点が、“logger.debug(log)”の記述しかなく、どうもログレベルがdebugレベルしかないと考えられた。
再度、開発者に事情聴取
パフォーマンスを劣化させている原因をいくつか発見したので、開発者へ再度ヒアリングを行う。問題を引き起こしている部分をまとめると、以下である。
- ログ出力がパフォーマンスを大幅に低下させている
- 出力されるログ量が多過ぎる
- ログが1つのファイルに出力される
- ログ出力処理が無条件に行われる
- ログレベルがdebugしかない(仮定)
現段階で仮定である“ログレベルがdebugしかない”点を開発者に確認したところ、やはりdebugしかないとのこと。
そして、解決へ……
これだけの原因があれば、付け焼き刃での対策ではパフォーマンスを改善できないと考え、以下の対策を施してもらうことにして、いったん引き揚げることにした。
- ログの必要/不必要の再検討
- ログレベルの再設計
- ログ出力先ファイルの分割
- ログ出力処理を「if(logger.isXXEnabled)」で囲む
結局、そのプロジェクトは提示した対策をすべて実施しログ設計まで手戻りを発生させることでトラブルを解決した。
ログ出力でトラブルを起こさないためのTips
今回はこのように、ログ出力にまつわるパフォーマンス・トラブルをハックした事例を紹介してきた。
読者の皆さんは、「たかがログでパフォーマンスがそこまで劣化するのか?」と思われるかもしれないが、筆者の経験上ログ出力方法が原因でパフォーマンス・トラブルが発生するシステムは数多く存在する。
そこで最後に、ログに関するパフォーマンスTipsを紹介する。
■Tips【1】ログ自体が必要かよく考慮する
いま考えているログは何に取得するか、という目的を意識すると、ログ自体が必要かどうか判別しやすくなる。
ログ設計指針が重要視され過ぎで、セキュリティ対策の一環や迅速なトラブル対応のために、ありとあらゆるログを取得するといったプロジェクトをまれに目にする。しかしそうなると、逆にログが膨大な量になり、解析に時間がかかるうえ、運用が開始されると結局、重要なログメッセージのみを監視するということになりがちである。
ログ自体を出力しなければ、ログ出力がパフォーマンストラブルを引き起こすこともないだろう。
■Tips【2】ログレベル、ログ出力方式をキチンと設計する
本当に必要なログが決まったら、出力するログの目的に応じたログレベルやログ出力方式を決定する。
Java EE開発で多く用いられるCommon Logging+Log4Jでは、軽微な情報出力から並べて、trace/debug/info/warn/error/fatalの6つのログレベルが存在する。ログレベルと出力内容は開発者が決定するものであるが、表1に各レベルに対応したログ出力例を示す。
ログレベル | 使用例 | |
---|---|---|
trace | ループ内部の変数などdebugの中でも大量に出力されるメッセージ。あまり使用しているプロジェクトはない | |
debug | セッション内部の情報やユーザーHTTPリクエスト、レスポンス情報など、開発中やテスト用のデバッグメッセージ | |
info | アプリケーションの起動情報やログインしたユーザーIDなど毎回出力させたいメッセージ | |
warn | 2重ログイン禁止のシステムで2重ログイン要求が発生したなど想定内の問題が発生したが、リクエストを処理し運用に問題ないメッセージ | |
error | DBサーバが無応答など、ユーザーからの処理を処理できない場合 | |
fatal | アプリケーションがこれ以上動作できない場合など。あまり使用しているプロジェクトはない |
また、ログ出力方式も性能に大きな影響を与える。ログファイルをパッケージごとやログレベルごとに分散することで、ログファイルのロック開放待ちを抑制できる。
ログの使用目的を熟慮したうえで、ログ出力が必要なときはネットワーク経由での非同期ログ出力を検討する。
注意!
Log4Jで非同期でのログ出力をサポートするAsyncAppenderクラスは使用方法が特殊なだけでなく、パフォーマンスを低下させる可能性もあるため、採用する前にはテストを行うことを推奨する。
org.apache.log4j.AsyncAppenderクラス
■Tips【3】ログ出力を実装するときは「if(Logger.isXXEnabled()){}」で囲む
ログレベル、ログ出力方式が決定したら、最後は実装時に行うTipsを解説する。
ログレベルをキチンと設計すると、ログ出力のための文字列連結などが不必要になるケースが多く出てくる。パフォーマンスを向上させるために、最大の効果が得られることは無駄な処理をしないことである。そのため、リスト3のようにログ出力の処理を削除するためにif文で囲む。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
「そのログ本当に必要ですか?」
ログ出力に関するパフォーマンス・トラブルは結合テストなどの後ろの工程で発覚することが多く、改修をするとアプリケーション全体に影響が及び、大きな手戻りになることも多い。そのため、ログ設計を行うときは「そのログ本当に必要ですか?」と自問自答しながら、熟慮してほしい。
プロフィール
佐藤 聖規(さとう まさのり)
NTTデータ 基盤システム事業本部所属。
入社よりWebシステムのパフォーマンステストやトラブルシューティングの社内支援業務を担当してきた。現在は、開発生産性を向上させるツール開発に従事するかたわら、トラブルシューティングする機会をうかがっている。
- 数百キロのコードでブルー - ドクターTomcat緊急救命
- DB操作の“壁”を壊すJPAが起こした「赤壁の戦い」
- アプリ開発でも、よ〜く考えよう。キャッシュは大事だよ
- スレッドダンプの森で覚えた死のロックへの違和感
- ThreadとHashMapに潜む無限回廊は実に面白い?
- JavaのGC頻度に惑わされた年末年始の苦いメモリ
- 肥え続けるTomcatと胃を痛めるトラブルハッカー
- 【トラブル大捜査線】失われたコネクションを追え!
- 【真夏の夜のミステリー】Tomcatを殺したのは誰だ?
- OutOfMemoryエラー発生!? GCがあるのに、なぜ?
- DBアクセスのトラブルは終盤で発覚しがち……
- 【実録ドキュメント】そのログ本当に必要ですか?
- “Stop the World”を防ぐコンカレントGCとは?
- Webアプリの問題点を「見える化」する7つ道具
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Adapterパターンを使い利用コンポーネントを切り替える
- アクセスログ記録のロジックをフィルタで一元化する
- Strutsのアクションマッピングに独自パラメータを追加
- 効率的なログ出力をCommonsで実現
[連載]現場に活かすJakarta Project(9) Commonsプロジェクトのツールを活用して効率的なログ出力を実現できる。Loggingとlog4jのメリットと使い方を紹介しよう - 正規表現の入力・テストをするプラグイン
CoolなEclipseプラグイン(5) 正規表現の入力とテスト、ログ出力コードの入力支援、プロパティファイルの入力支援をする3種類のプラグインを紹介する - 事例に学ぶWebシステム開発のワンポイント
現場のエンジニアの経験から得られた、アプリケーション・サーバをベースとしたWebシステム開発におけるノウハウ、注意点について解説 - 第1回 クラスタ化すると遅くなる?(2002/3/9)
- 第2回 キャッシュが性能劣化をもたらす謎を解く(2002/3/23)
- 第3回 クラスタは何台までOK?(2002/4/19)
- 第4回 マルチスレッドのいたずらに注意(2002/5/14)
- 第5回 クラスタによるアプリケーションの動的アップデート(2002/6/4)
- 第6回 APサーバからの応答がなくなった、なぜ?(2002/11/30)
- 第7回 低負荷なのにCPU使用率が100%?(2002/12/11)
- 第8回 文字化け“???”の法則とその防止策(2003/1/28)
- 第9回 メモリは足りているのに“OutOfMemory”のなぞ(2003/2/15)
- 第10回 レスポンスキャッシュでパフォーマンス向上(2003/3/29)
- 第11回 JDBC接続を高速化―PreparedCacheの活用(2003/4/18)
- 第12回 ブラウザキャッシュでパフォーマンス向上(2003/5/10)
- 第13回 ファイルアップロード/ダウンロードに潜むわな(2003/6/12)
- Ajaxでデバッグしよう
特集:AJAXリモート・ログ・エージェント技法 Webアプリ開発で、動作確認メッセージが出力できない。そんなときは、Ajaxでブラウザの動作ログをサーバに出力してみよう - アクセス解析ツールを比べてみよう
特集:アクセス解析ツール比較 Webサイトの利用増で、ユーザーのアクセス状況を分析することが重要になっている。市場のツールを比較してみよう