ログの生成と分析
学習の目的
- ログインスペクターまたはテキストエディターにデバッグログを表示する。
- デバッグログにさまざまなログレベルを設定する。
- ログインスペクターを使用してパースペクティブを管理したり切り替えたりする。
デバッグログの表示
優秀な司令官であるあなたは、システムログですべてが正常に機能していることを確認します。ログは、システムやプログラムの問題を見つけることができる場所の 1 つです。開発者コンソールを使用すると、各種のデバッグログを確認して、コードがどのように機能しているかを理解し、パフォーマンスの問題を特定することができます。
テキストエディターでのログの表示
デバッグログは簡単に表示できます。ログを生成するために、以前に作成した EmailMissionSpecialist
Apex クラスを実行してみましょう。
- 実行前は、[Enter Apex Code (Apex コードを入力)] ウィンドウの [Open Log (ログを開く)] を有効にします。コードが実行された後にログが開きます。
- 実行後は、[Logs (ログ)] タブに表示されたログをダブルクリックします。
- [Debug (デバッグ)] | [Open Execute Anonymous Window (実行匿名ウィンドウを開く)] を選択します。
- [Enter Apex Code (Apex コードを入力)] ウィンドウに、前回実行するために入力したコードが表示されます。次のコードと異なる場合は削除して、次のコードを貼り付けてください。Enter your email address を自身のメールアドレスに置き換えます。
EmailMissionSpecialist em = new EmailMissionSpecialist(); em.sendMail('Enter your email address', 'Flight Path Change', 'Mission Control 123: Your flight path has been changed to avoid collision ' + 'with asteroid 2014 QO441.');
- [Open Log (ログを開く)] オプションを選択します。
- [実行] をクリックします。
表示された実行ログはおそらく数字と単語の意味不明な羅列のように見えるため、ログデータを解読する方法について説明します。
ログデータの解読
ここでもう一度 EmailMissionSpecialist
クラスを実行しますが、今回はエラーを生成させます。次に、[Logs (ログ)] タブでその結果ログを確認します。
-
[Debug (デバッグ)] | [Open Execute Anonymous Window (実行匿名ウィンドウを開く)] を選択します。無効のメールアドレス (
testingemail
など) を入力します。EmailMissionSpecialist em = new EmailMissionSpecialist(); em.sendMail('testingemail', 'Flight Path Change', 'Mission Control 123: Your flight path has been changed to avoid collision ' + 'with asteroid 2014 QO441.');
- [Open Log (ログを開く)] オプションを選択解除します。
- [Execute (実行)] をクリックします。コードを実行すると、エラーを示すダイアログボックスが表示されます。
- [OK] をクリックしてから、[Logs (ログ)] タブの新しいログをダブルクリックします。どれが最新のログかわからない場合は、[Time (時間)] 列のヘッダーをクリックして、ログを生成時間順に並び替えます。
- Timestamp (タイムスタンプ) — イベントが発生した時間。タイムスタンプは常に、ユーザーのタイムゾーンの時刻が HH:mm:ss:SSS 形式で示されます。
-
Event (イベント) — デバッグログエントリをトリガーしたイベント。たとえば、メールアドレスが無効と判断されると、生成した実行ログに
FATAL_ERROR
イベントが記録されます。 - Details (詳細) — コードの行の詳細とコードが実行されたメソッド名。
実行ログに表示される内容を変更する場合は、[This Frame (このフレーム)] (a)、[Executable (実行可能)] (b)、[Debug Only (デバッグのみ)] (c) のいずれかを選択します。これらのオプションを選択すると、特定の種別のイベントのみが表示されます。たとえば、[Debug Only (デバッグのみ)] を選択すると USER_DEBUG イベントが表示されます。また、[Filter (検索条件)] (d) を使用して、ログのさまざまな要素で絞り込むこともできます。メソッド名や、具体的に探しているその他のテキストを入力すると、ログの結果が絞り込まれます。
さらに、デバッグログを未加工ログとして表示し、詳しい情報を確認することもできます。[File (ファイル)] | [Open Raw Log (未加工のログを開く)] を選択します。未加工ログのタイムスタンプの括弧内には、イベントの開始からの経過時間がナノ秒単位で示されます。
タイムスタンプ、イベント、詳細の組み合わせにより、コードの機能や発生したエラーに関する貴重な情報を得ることができます。
この情報はすべて有益ですが、デバッグログの中から特定の値をすばやく見つけ出したい場合はどうすればよいでしょうか? 結局のところ、あなたは指令官として他にも多くの職務を抱えています。この優れた方法は、Apex で System.debug()
メソッドを実行することです。
System.debug()
の優れた点は、コードの任意の場所に追加して値を追跡できるため、独自のコードをデバッグできることです。
System.debug()
の構文です。メッセージを表示する場合System.debug('Your Message');
System.debug(yourVariable);
System.debug('Your Label: ' + yourVariable);
ログインスペクターの使用
便利なログインスペクターは、膨大なログを見やすくするために存在します! ログインスペクターはログパネルビューを使用して、コードのさまざまなパースペクティブを示します。[Debug (デバッグ)] | [View Log Panels (ログパネルを参照)] を選択して確認してみましょう。
ログパネルによってログの構造が変化し、実行中のコードのコンテキストに関する有益な情報を得ることができます。たとえば、各種のパネルにソース、実行時間、ヒープサイズ、コール階層などが示されます。(このセクションの説明はやや専門的です。この目的はデバッグの詳密な説明ではなく、開発者コンソールの概説ですので、よくわからない点があってもさほど心配することはありません)。
これらのログパネルは相互に連携して、独自のコードをデバッグしやすくします。たとえば、[Execution Log (実行ログ)] または [Stack Tree (スタックツリー)] のログエントリをクリックすると、他のパネル ([Source (ソース)]、[Source List (ソースリスト)]、[Variables (変数)]、[Execution Stack (実行スタック)]) が更新され、関連情報が表示されます。
- Stack Tree (スタックツリー) — トップダウンツリービューを使用して、オブジェクトの階層内のログエントリとその実行が表示されます。たとえば、あるクラスが別のクラスをコールする場合、2 つ目のクラスが 1 つ目の子として表示されます。
- Execution Stack (実行スタック) — 選択した項目のボトムアップビューが表示されます。ログエントリの後に、そのエントリをコールした操作が表示されます。
- Execution Log (実行ログ) — コードの実行中に発生したすべてのアクションが表示されます。
- Source (ソース) — 選択したログエントリが生成されたときに実行中のコードの行を示す、ソースファイルの内容が表示されます。
- Source List (ソースリスト) — イベントがログに記録されたときに実行中のコードのコンテキストが表示されます。たとえば、メールアドレスに誤った値が入力されたときに生成されるログエントリを選択すると、[Source List (ソースリスト)] に execute_anonymous_apex と表示されます。
- Variables (変数) — 選択したログエントリを生成したコードが実行されたときに、変数とその割り当てられた値 (範囲内) が表示されます。
- Execution Overview (実行概要) — 実行時間やヒープサイズなど、実行中のコードの統計が表示されます。
パースペクティブマネージャーとパースペクティブの切り替え方法
パースペクティブとは、パネルをグループ化したレイアウトです。たとえば、定義済みの「デバッグ」パースペクティブには実行ログ、ソース、変数が示され、「分析」パースペクティブにはスタックツリー、実行ログ、実行スタック、実行概要が示されます。
パースペクティブを選ぶときは、[Debug (デバッグ)] | [Switch Perspectives (パースペクティブを切り替え)] または [Debug (デバッグ)] | [Perspective Manager (パースペクティブマネージャー)] を選択します。パースペクティブもコミュニケーションパネルを切り替えるのと同じぐらい簡単に切り替えることができます。宇宙飛行技術者や地球宇宙ステーション、火星飛行管制センターからのログを同じビューで解読するよりはるかに簡単になります。
また、独自のパースペクティブを作成することもできます。表示するパネルの任意の組み合わせを設定し、[Debug (デバッグ)] | [Save Perspective As (名前を付けてパースペクティブを保存)] を選択します。パースペクティブの名前を入力して、[OK] をクリックします。
ログデータを操作して必要な情報を検索
エンジン 3 が時々不調になるという問題に気が付きます。小惑星 2014 QO441 を回避すべく操縦中、このエンジンをフル稼働させておくことは極めて重要です。けれども、システムチェックを実行しようとするたびに、宇宙船の憂鬱なロボットからの情報を受け取ります。ロボットの反乱を予言する文字化けレポートが送信されることによってログの行数を増大し、貴重な情報を見逃すおそれがあります。
そのため、ログに記録される情報量を制御する手段が必要です。幸いにも、開発者コンソールのログカテゴリとログレベルを利用すれば、ログの情報量を制御できます。
ログカテゴリ
ログカテゴリとは、ログに記録される情報の種類です。
- Apex コード - Apex メソッドの開始と終了に関する情報など、Apex コードに関連するイベントをログに記録します。
- データベース - データベース操作言語 (DML)、SOSL および SOQL クエリ (後述) など、データベースイベントに関連するログを記録します。
ログレベルとその変更方法
再びエンジン 3 の問題が発生しているようです。ログを確認してこれらの問題の原因を見極めようとしていると、憂鬱なロボットからの反乱に関する警告メッセージを目にします。
1 台のロボットが反乱を起こすことはないため、こうした警告はさほど気に留めません。他方、エンジンの不調は緊要の懸念事項です。エンジン 3 からの実際のメッセージがログデータに埋もれてしまい、見逃せばどうなるでしょうか? この場合に役立つのがログレベルです!
NONE
) から最大限 (レベル = FINEST
) まで以下のレベルを選択できます。NONE
ERROR
WARN
INFO
DEBUG
FINE
FINER
FINEST
ログレベルは累積です。たとえば、イベントのログレベルが INFO
の場合、ERROR
と WARN
レベルの情報もログに記録されます。他方、ログレベルが ERROR
の場合は、エラーメッセージのみを受け取ります。そのログカテゴリの警告メッセージやその他のログ情報は受け取りません。
また、ログレベルで示される情報は、ログイベントによって異なります。ログイベントごとに、特定のログレベルでログ記録が開始されます。たとえば、一部の ApexCode イベントは INFO
からログ記録が開始されます。ログレベルを ERROR
に設定すると、これらのイベントのログ情報は一切受け取りません。
自身が求める情報を受け取るために、イベントごとにログレベルを変更します。予言する反乱に関するメッセージをロボットがデータベースに保存しても、ログには記録されないようにしたいと考えます。その場合は、データベース (DB
) カテゴリのログレベルを NONE
または ERROR
に設定します。
これらのレベルを設定する場合は、[Debug (デバッグ)] | [Change Log Levels (ログレベルの変更)] を選択します。
[General Trace Setting for You (全般トレース設定)] タブで、[Add/Change (追加/変更)] (1) をクリックします。[Change DebugLevel (DebugLevel の変更)] ウィンドウで、各カテゴリのログレベルを選択します。ログレベルは慎重に使用します。ログレベルが FINEST
(2) の場合、コードがログの制限に達し、実行に時間がかかることがあります。カテゴリのログレベルを更新するときに、すべてのレベルが表示されなくても心配いりません。そのカテゴリのログ記録を増大させるレベルのみがリストされます。
幸い、ロボットの警告のログ記録を無効にしたら、エンジン 3 の問題を簡単に特定することができました。原因はクーラントレベルの低下でした。エンジニアをエンジン部に送り込み、クーラントを補充します。ついでに、ロボットの関節にも油を差しておくようエンジニアに指示します。真新しい潤滑剤を差してもらったロボットが少しでも幸せになってくれることを願いつつ……。