Fork me on GitHub

このアプリケーションについて

LogAnalyzerは株式会社FLECTが開発したPapertrailに転送されたログを解析するためのオープンソースアプリケーションです。

GitHubから取得したソースをHerokuにpushすることで、どなたでも使用することができます。

基本的にはインストール時に設定したPapertrailアーカイブ情報を用いてログを解析しますが、Heroku OAuthまたはPapertrailのAPI Tokenを利用したリアルタイムログ解析も可能です。

リアルタイムログ解析は設定情報に依存しないので、どなたでもご自身のアプリをリアルタイムログ解析にかけることができます。

このアプリケーションの第一義はFLECTの開発/運用するサービスのログを解析することです。

ソース公開はされていますが、管理されたプロダクトとしてリリースしているわけではないので必要に応じて予告なく改変されることがあります。

セットアップ

前提条件

このアプリはPapertrailのアーカイブしたログを解析するものなので

  • アプリのログをPapertrailに流していて、
  • そのログをS3上にアーカイブしていること

が動作させるための前提条件となります。

Papertrailを使用していればアプリ自体はHeroku上で動作していなくても構いません。

Herokuにインストールすためのコマンド

Heroku上でこのアプリを動かすためのコマンドは以下の通りです。

    git clone git@github.com:shunjikonishi/papertrail-log-analyze.git
    heroku create
    git push heroku master
    heroku config:add S3_ACCESSKEY=<your aws accessKey> 
    heroku config:add S3_SECRETKEY=<your aws secretKey> 
    heroku config:add PAPERTRAIL_ARCHIVE_APP1=<your S3 bucket>/papertrail/logs
    heroku config:add TIMEZONE=Asia/Tokyo

必要に応じてセキュリティ強化のための追加のconfigを設定してください。

Addonは必要なく、1Dynoでも十分に動作するので無料で運用することが可能です。

config設定項目

基本設定
S3_ACCESSKEY S3からログを取得するために使用するAWSのアクセスキー
S3_SECRETKEY S3からログを取得するために使用するAWSのシークレットキー
PAPERTRAIL_ARCHIVE_<APPNAME> PapertrailがアーカイブしているS3バケットへのパス
APPNAMEの部分は画面表示に使用しているだけなので任意の名前が指定できる
複数設定可
TIMEZONE 時刻表示のためのタイムゾーン。省略時はUTC
日本であれば「Asia/Tokyo」を設定。
セキュリティ設定
ALLOWED_IP アクセスを許可するIPアドレス
カンマ区切りで複数設定可
CIDR表記(Ex. 192.168.1.0/24)が使用可能
BASIC_AUTHENTICATION Basic認証用のユーザー名とパスワード
ユーザー名とパスワードを「:」で区切って設定する
PASSPHRASE 任意のパスフレーズ
指定すると設定画面表示、またはダウンロードの際にパスフレーズ入力を要求されるようになる
Heroku OAuth設定
HEROKU_OAUTH_ID Herokuに登録したOAuthクライアントのID
HEROKU_OAUTH_SECRET Herokuに登録したOAuthクライアントのシークレット

Heroku OAuth設定はHerokuアカウントを使用したリアルタイムログ解析を行う場合にのみ使用なものなので通常は設定する必要はありません

設定が適切に行われるとトップ画面にPAPERTRAIL_ARCHIVE_XXXXで設定したアプリの一覧が表示されます。

ログ解析画面

表示するログを選択するためのカレンダーと、時間帯ごとの解析結果を表示するテーブル、テーブルで選択した行のグラフから構成されます。

Papertrailのログは毎日UTCの0時(日本時間 午前9時)以降にS3にアップされますが、日付が変わるとすぐにアップされるわけではなく長い時には数時間程度のタイムラグがあります。

ログ件数テーブル

ログ件数テーブルには条件にマッチしたログの行数が時間帯毎に表示されます。

時間帯毎に表示される内容は以下です。

  • 件数 - その時間帯に出力されたログの件数
  • 分間 - その時間帯で1分間にそのログが出力された回数の最大値
  • 秒間 - その時間帯で1秒間にそのログが出力された回数の最大値

ここで数えられるログの条件には以下のものがあります。

すべてのログ すべてのログ
すべてのアクセス アクセスログ(heroku/routerの出力ログ)
XXms以上かかったリクエスト アクセスログのうちservice=xxmsが指定時間よりも大きいログ
接続にXXms以上かかったリクエスト アクセスログのうちconnect=xxmsが指定時間よりも大きいログ
サーバーエラー(50x) アクセスログのうちstatus=50xのログ
クライアントエラー(40x) アクセスログのうちstatus=40xのログ
Herokuエラー別 Herokuのエラーコードが出力されているログ(コード別にカウント)
Dynoステート変更 再起動など「State changed」が出力されているログ
プログラム別 プログラム毎のログ
正規表現 任意の正規表現にマッチするログ

ログ内の数値の最大値と平均値テーブル

こちらのテーブルにはログ内から拾った数値の時間帯ごとの最大値と平均値が集計して表示されます。

主な集計対象はレスポンスタイム(アクセスログのservice=XXms)です。

  • 件数 - その時間帯に出力された集計対象のログ件数
  • 最大 - その時間帯で出力された集計対象の値の最大値
  • 平均 - その時間帯で出力された集計対象の値の平均値
レスポンスタイム パス毎のレスポンスタイム(アクセスログのservice=XXms)
正規表現を使用して除外するパスやまとめるパスを指定できます。
例)
静的ページを除外 - /public/.*
商品詳細画面をまとめる - /goods/detail/\d+
接続時間 アクセスログのconnect=XXms
遅延SQL HerokuPostgresのログのduration
Dyno起動時間 Dynoステート変更ログのstartingからupまでの時間
正規表現数値 任意の正規表現から抽出した数字

標準で使用できる条件の多くはHerokuのログフォーマットに依存しています。

解析内容の詳細についてはSlideshareにアップした資料も参照してください。

ログメトリクス

設定画面でlog-metricsを有効にすると、選択した日付のログから指定の数値を拾ったグラフが表示できるようになります。

ログ内で「<NAME>=<数値>」というフォーマットで出力されていれば何でもグラフ化することができます。

デフォルトではHerokuのlog-runtime-metricsが出力するmemory_totalとmemory_rssがグラフ化対象となっています。

グラフはプログラム別(Herokuで言えばDyno毎)に表示されます。

リアルタイムログ解析

log metricsのグラフはアーカイブされたログから表示するだけでなく、PapertrailまたはHerokuのWebAPIを使用して表示することが可能です。

Papertrail API

トップ画面のフォームで以下の項目を入力することでリアルタイムグラフが表示されます。

APIToken PapertrailのAPIToken
PapertrailのProfile画面またはheroku configで参照できます。
キーワード グラフ化する項目名をカンマ区切りで指定します。
期間 初期表示で何時間分のログを取ってくるかを指定します。

期間の指定は初期表示のための期間であり時間が経過してもグラフにプロットされたポイントが減ることはありません。

Heroku OAuth

リアルタイムグラフのソースとなるログはHerokuのOAuthでも取得することができます。この場合PapertrailはAddonとして追加されている必要はありません。

ただしHerokuから取得できるログは直近の1500行のみなので、それなりにログ出力のあるアプリでは初期表示で数個しかグラフにプロットするポイントがないという状態になります。

可能であればPapertrailのAPITokenを使用する方が良いです。

アプリの機能として考えた場合はこのHeroku OAuthでのリアルタイムグラフの機能は外しても良いんですが、PlatformAPIのサンプルとして残しています。

Herokuのログ解析ツール
このアプリでのログ解析内容の詳細説明
お手軽AJAXアプリケーションの作り方
このアプリを題材としたAjaxアプリケーションの作り方解説
HerokuとJavaのメモリのお話
リアルタイム解析を作った時に書いたブログ
PapertrailTool
Papertrailのログ解析に使用しているライブラリ
heroku-platform-api
HerokuのPlatformAPIのJavaラッパー
oss.flect.co.jp
このアプリを含むFLECTのオープンソースライブラリのポータル