Heroku Tips (3) Papertrail を使いこなす

January 7, 2019 Naoki Kitaarashi

皆さん、こんにちは。アピリオ北嵐です。今回のTipsはHerokuアプリケーションを使う上でなくてはならないアドオンであるPapertrailを取り上げてみたいと思います。PapertrailはHerokuアプリが出力するログを管理するアドオンであり、データを保存するためのディスクを持たないHerokuはこのPapertrailなしではログを保持・保管することができません。Herokuサーバー上でのテストが始まるITフェーズ以降では、Papertrailを使ってログを参照する頻度は高いので、しっかりと使いこなす必要があると言えます。

1. Papertrailに出力されるログの種類

Papertrailに出力されるログはアプリケーションが出力するログだけではなく、Heroku上の様々なコンポーネントがここにログを出力します。代表的なものを下記に示します。

プログラムの種類 説明
app/web Dyno上で稼働するアプリケーションが出力したログ
app/api Dyno上へのデプロイ状況、環境変数の変更など
app/heroku-postgres Heroku Postgresサーバーが出力したログ
app/heroku-redis Heroku Redisサーバーが出力したログ
app/herokuconnect Heroku Connectが出力したログ
heroku/router HTTPサーバーレベルの入出力ログ
heroku/web Dnyo自体の稼働状況を示すログ

通常、Papertrailのログには上記に示したような各コンポーネントのログが混在する状態で出力されます。そのため、効率的にログを参照するためには少し工夫する必要があります。

2. タイムゾーンの指定

デフォルトでは画面に表示されるログの時間はJST(日本時間)ではありません。Papertrailにはユーザーのタイムゾーンにより自動的に表示時間を調整してくれる機能がありますので、必ず設定するようにして下さい(Herokuアプリごとの設定になります)。画面上部の [Settings] をクリックして [Profile] を選択し、TimezoneでTokyo(GMT+09:00) を選んで保存して下さい。
 

3. ログの検索

Papertrailのログは画面上から簡単にキーワードを使って検索し絞り込むことができます。例えば下記のように検索ボックスに“heroku/router"と入力すれば、heroku/router が出力したログのみが時系列に表示されます。
 
 
キーワードのシンタックスは以下のようになります。大文字・小文字は区別されないことに注意して下さい。
複数のキーワードをAND条件で繋ぎたい場合は、スペースで区切ります。

例:heroku/router POST

OR条件で繋ぎたい場合は OR で繋ぎます。

例:heroku/router OR heroku/postgres

キーワードにスペースを含めたい場合はダブルクォーテーションで囲みます。

例:"ERROR 12" app/web

特定のキーワードを含めたくない場合は、文字列の前にーを付けます。

例:heroku/router -200 

予め準備されたキーワードを選択リストから選ぶこともできます。また、カスタムキーワードをこのリストに登録することも可能です。

キーワード 表示されるログ
Deploys Dyno上へのデプロイ状況、環境変数の変更など。app/api プログラムが出力したログ
Dyno state changes 各Dynoの稼働状況(ステータス)
Platform errors Heroku DynoやHeroku Routerが出力するエラーログ(H12 タイムアウトなど)
Scheduler jobs Heroku Schedulerが起動したアプリケーションが出力するログ
Web app output Dyno上のアプリケーションが出力するログ

Papertrailには大量のログが出力されるため、検索による絞り込みだけでは目的とするログをうまく参照できません。そんな時に役立つのが特定の時間帯のログを表示する機能です。画面下の時計アイコンのあるボタンをクリックして表示させたい時間を指定します。タイムゾーンが指定してあれば、日本時間を入力できます。

よく使うのは、検索により目的のログが出力された時間を特定し、その時間帯のログを上記機能を使って表示する方法です。大量のログが出力されると目的のログを見つけることが面倒になりますので、この時間指定の機能は是非覚えておいて下さい。

 

4. ログのフィルタリング
 
出力されるログそのものを抑止するフィルタリング機能も提供されています。”出力する必要なし”と判断したログについては、特定のキーワードや正規表現を使って出力させないようにできます。この方法ですとログ容量そのものを抑えることができますので、契約するPapertrailのプランにも影響します。
 
フィルタリングの設定は、画面上部の [Settings] をクリックして、 [Filter Logs] ボタンを押下して表示される画面から行います。
 
 
[文字列 SmpleUrlHandlerMappingが含まれるログを出力しない例]
 
設定の詳細についてはこちらを参照して下さい。
 

5. ログの省略

ログは複数行に渡って出力されるためログ全体を俯瞰して見たい場合、ログの省略(Truncate)オプションをONにすると良いです(右下にある [Options]から切り替え可能)。1つのログが1行に省略されて表示されるので見やすくなります。この状態だと各行をクリックすると省略されていた部分が表示されます。
 
[通常の表示]
 
[Truncate ONの表示]
 

6. アラートの送信

ログを目視で監視することは現実的ではないため、Papertrailには特定のキーワードにマッチするログ出力を定期的にアラートとしてユーザーに送信する機能が提供されています。下記のように設定します。
 
1.  キーワードを指定してログを検索します。
 
2. 右下の "Save Search"ボタンを押します。
 
3. 検索条件に名前を設定して、[Save & Setup an Alert] ボタンを押します。
 
 
4. 通知を行う媒体を選択します。ここでは Email を選びます。
 
 
 
5. 通知間隔、条件、時刻表示のタイムゾーン、宛先 を指定して、[Create Alert]ボタンを押します。
 
 
 
下記のようなアラートメールが定期的にPapertrailから送信されます。
 
 
 
7. アーカイブログの取得
 
Papertrail上に保管されたログは各プランで決められた日数しか画面から検索することはできません(ログのボリュームによりアーカイブされるタイミングは変わります。本番環境だとログ量が増えるため数日程度)。期限を過ぎたログはアーカイブとして一定期間保管され、ダウンロードして参照することができます。このダウンロードが結構面倒くさいのです・・・
 
[Settings] - [Archives] を選択するとアーカイブダウンロード用の画面が開きますが、ここではファイルごとにダウンロードしなければなりません。アーカイブされるログの粒度は1時間 または 1日で、ログの量が多いと1時間単位となり、アーカイブされるログの数も大量になります。
 
残念ながら画面からはファイルを一括してダウンロードすることはできませんが、コマンド操作であればまとめてダウンロードできます。下記に手順を示します(Mac または Windowsの場合はCygwinなどのUnix環境から実行する)。
 
1. API Tokenの取得
 
画面上部の [Settings] をクリックして [Profile] を選択し、API Tokenを記録します。
 
 
2. コマンドの実行
 
ファイルを保存するフォルダを作成し、そのフォルダをカレントフォルダとしてコマンドウィンドウを立ち上げて、下記のコマンドを実行します。
>1時間単位のログの取得 
> ## には現在から遡って取得するログファイルの数を指定
> ==api-token== には自分のユーザーのAPI Tokenを指定
seq 1 ## | xargs -I {} date -u -v-{}H +%Y-%m-%d-%H | \
    xargs -I {} curl --progress-bar -f --no-include -o {}.tsv.gz \
    -L -H "X-Papertrail-Token: ==api-token==" https://papertrailapp.com/api/v1/archives/{}/download

>1日単位のログの取得
> ## には現在から遡って取得するログファイルの数を指定
> ==api-token== には自分のユーザーのAPI Tokenを指定
seq 1 ## | xargs -I {} date -u -v-{}d +%Y-%m-%d | \
    xargs -I {} curl --progress-bar -f --no-include -o {}.tsv.gz \
    -L -H "X-Papertrail-Token: ==api-token==" https://papertrailapp.com/api/v1/archives/{}/download

ログが1日単位で保管されているか、1時間単位で保管されているかで、実行するコマンドの書式が異なります。##には取得するファイル数を指定して下さい。例えば1日単位で保存されている場合に60を指定すると、今日から遡って60日分(当日分はアーカイブされていないので除く)のファイルがgzip形式の圧縮ファイルとしてダウンロードされます。

ダウンロードされた大量の.gzファイルは下記のコマンドで一括解凍できます。

 find . -name "*.gz" -print0 | xargs -0 -n1 gzip -d

 

8. ログの共有とグルーピング

通常、1つのHerokuアプリに1つのPapertrailの契約(subscription)を紐付けますが、複数のアプリで1つの契約を共有することもできます。共有したい場合は、既存アプリのPapertrailアドオンの設定から「Attach to another app」を選び、Herokuアプリを選択します。

 

共有しているアプリは「Dashboard」から確認することができます。また、共有しているアプリの中から一部のアプリのログのみを表示させたい場合は、”グループ”機能を使用します(画面右のMyGroupに登録済みのグループが表示されます)。複数のアプリケーションを1つの契約に紐付けるケースでは便利な機能 です。

9. コマンド操作

PapertrailのGUI画面は使い易いものですが、この画面を起動するには、Herokuにログイン → 該当のHerokuアプリを選択 → PapertrailのAddon画面を選択 と何ステップか必要になります。モバイル環境でネットワークが細い時などは、何度もクリックするのはちょっと面倒だなと思ってしまうこともあります。そこで、コマンドを使ってPapertrailのGUIを画面を一発で起動する方法を最後に紹介しておきます。
 
heroku addons:open papertrail -a アプリ名

上記のコマンドでブラウザが開き、当該アプリのログ画面が開きます。

 

いかがでしたでしょうか。 たかがログ管理とは言えないほど、様々な機能が提供されているPapertrailです。Herokuの監視および障害解析時には欠かせないツールですので、しっかりと使いこなして効率的にログを参照できるようにして下さい。

 
 

著者について

某大手SIベンダーを退職し2015年からアピリオの一員としてクラウドの世界に身を投じているシニアエンジニアです。プロジェクトでの立場に応じて、アーキテクト、リーダー、デベロッパーと様々なロールの仕事に携わっています。1人のエンジニアとして技術の最先端に居続けることが技術者としてのこだわりです (^o^) やはりクラウドの世界は面白い!

Naoki Kitaarashi のコンテンツをもっと見る
戻る
Salesforce Connectで外部オブジェクトを利用してみよう
Salesforce Connectで外部オブジェクトを利用してみよう

Salesforce Connectを利用してコーディングをせず、Salesforce外のシステムにあるデータを、外部オブジェクトとしてSalesforceにとりこみ、利用する方法について説明します。

次へ
Heroku Tips(6) BlazeMeter による負荷テスト
Heroku Tips(6) BlazeMeter による負荷テスト

Heroku Tipsの6回目は、Heroku アドオンのBlazeMeterをご紹介したいと思います。クラウドの世界においても構築したWebアプリケーションに対する負荷テストは従来と同様に重要なものです。今回ご紹...

アピリオまでお気軽にお問合せください

ご質問はこちら