ロギング

あらゆる種類のアプリを開発する場合、開発中の障害の診断や、お客様の問題の特定と診断などの目的で、情報をログに記録することがよくあります。

Apps Script には、次の 3 種類のロギング メカニズムがあります。

  • 組み込みの Apps Script 実行ログ。このログは軽量で、リアルタイムでストリーミングされますが、保持されるのは短時間だけです。

  • デベロッパー コンソールの Cloud Logging インターフェース。このインターフェースは、作成後数日間保持されるログを提供します。

  • デベロッパー コンソールの Error Reporting インターフェース。スクリプトの実行中に発生したエラーを収集して記録します。

これらについては、次のセクションで説明します。これらのメカニズムに加えて、独自のロガーコードを作成して、たとえばロギング スプレッドシートJDBC データベースに情報を書き込むこともできます。

Apps Script の実行ログを使用する

Apps Script にログインするための基本的な方法は、組み込みの実行ログを使用することです。これらのログを表示するには、エディタの上部にある [実行ログ] をクリックします。関数を実行するかデバッガを使用すると、ログがリアルタイムでストリーミングされます。

組み込み実行ログでは、Logger または console ロギング サービスを使用できます。

これらのログは、開発とデバッグの簡単なチェックを目的としており、それほど長く保持されることはありません。

たとえば、次の関数について考えてみましょう。

utils/logging.gs
/**
 * Logs Google Sheet information.
 * @param {number} rowNumber The spreadsheet row number.
 * @param {string} email The email to send with the row data.
 */
function emailDataRow(rowNumber, email) {
  console.log('Emailing data row ' + rowNumber + ' to ' + email);
  try {
    const sheet = SpreadsheetApp.getActiveSheet();
    const data = sheet.getDataRange().getValues();
    const rowData = data[rowNumber - 1].join(' ');
    console.log('Row ' + rowNumber + ' data: ' + rowData);
    MailApp.sendEmail(email, 'Data in row ' + rowNumber, rowData);
  } catch (err) {
    // TODO (developer) - Handle exception
    console.log('Failed with error %s', err.message);
  }
}

「2」と「john@example.com」の入力を指定してこのスクリプトを実行すると、次のログが書き込まれます。

[16-09-12 13:50:42:193 PDT] データ行 2 を john@example.com にメールで送信
[16-09-12 13:50:42:271 PDT] 行 2 データ: 費用 103.24

Cloud Logging

Apps Script では、Google Cloud Platform(GCP)の Cloud Logging サービスへの部分的なアクセス権も提供されます。数日間持続するロギングが必要な場合や、マルチユーザーの本番環境でより複雑なロギング ソリューションが必要な場合は、Cloud Logging をおすすめします。データの保持やその他の割り当ての詳細については、Cloud Logging の割り当てと上限をご覧ください。

さらに多くのロギング割り当てが必要な場合は、Google Cloud Platform の割り当てリクエストを送信できます。そのためには、スクリプトで使用する Cloud Platform プロジェクトへのアクセス権が必要です。

Cloud Logging の使用

Cloud ログは、Apps Script に関連付けられた Google Cloud プロジェクトに関連付けられます。これらのログの簡易版は、Apps Script ダッシュボードで確認できます。

Cloud Logging とその機能を最大限に活用するには、スクリプト プロジェクトで標準の Google Cloud プロジェクトを使用します。これにより、GCP Console から直接 Cloud ログにアクセスできるようになり、表示やフィルタのオプションが増えます。

ロギングするときは、ユーザーの個人情報(メールアドレスなど)を記録しないようにすることをおすすめします。Cloud ログには、アクティブ ユーザーキーが自動的にラベル付けされ、必要に応じて特定のユーザーのログメッセージを見つけることができます。

Apps Script の console サービスが提供する関数を使用して、文字列、書式設定された文字列、JSON オブジェクトをログに記録できます。

次の例は、console サービスを使用して Cloud Operations に情報を記録する方法を示しています。

utils/logging.gs
/**
 * Logs the time taken to execute 'myFunction'.
 */
function measuringExecutionTime() {
  // A simple INFO log message, using sprintf() formatting.
  console.info('Timing the %s function (%d arguments)', 'myFunction', 1);

  // Log a JSON object at a DEBUG level. The log is labeled
  // with the message string in the log viewer, and the JSON content
  // is displayed in the expanded log structure under "jsonPayload".
  const parameters = {
    isValid: true,
    content: 'some string',
    timestamp: new Date()
  };
  console.log({message: 'Function Input', initialData: parameters});
  const label = 'myFunction() time'; // Labels the timing log entry.
  console.time(label); // Starts the timer.
  try {
    myFunction(parameters); // Function to time.
  } catch (e) {
    // Logs an ERROR message.
    console.error('myFunction() yielded an error: ' + e);
  }
  console.timeEnd(label); // Stops the timer, logs execution duration.
}

アクティブなユーザーキー

一時的なアクティブ ユーザーキーは、ユーザーの ID を明らかにすることなく、Cloud ログエントリ内のユニーク ユーザーを簡単に見つけることができます。キーはスクリプトごとであり、ほぼ月に 1 回変更されます。これにより、問題を報告するときなど、ユーザーがデベロッパーの身元を明かしたときに、セキュリティを強化できます。

一時的なアクティブ ユーザーキーは、次の理由により、メールアドレスなどのロギング識別子よりも優れています。

  • ログはすでに存在するため、何も追加する必要はありません。
  • ユーザーの承認は必要ありません。
  • ユーザーのプライバシーを保護する。

Cloud ログエントリで一時的なアクティブ ユーザーキーを見つけるには、Google Cloud コンソールで Cloud のログを表示します。これは、アクセス可能な標準の Google Cloud プロジェクトをスクリプト プロジェクトが使用している場合にのみ行うことができます。コンソールで Google Cloud プロジェクトを開いたら、目的のログエントリを選択して展開し、[metadata] > [labels] > [script.googleapis.com/user_key] を表示します。

一時的なアクティブ ユーザーキーは、スクリプトで Session.getTemporaryActiveUserKey() を呼び出して取得することもできます。このメソッドを使用する方法の 1 つは、ユーザーがスクリプトの実行中にキーを表示することです。その場合、ユーザーは問題を報告する際にキーを含めることを選択して、関連するログを特定できます。

例外ロギング

例外ロギングは、スクリプト プロジェクト コード内の未処理の例外をスタック トレースとともに Cloud Logging に送信します。

例外ログを表示する手順は次のとおりです。

  1. Apps Script プロジェクトを開きます。
  2. 左側の [Executions] をクリックします。
  3. 上部の [フィルタを追加] > [ステータス] をクリックします。
  4. [Failed] と [Timed out] のチェックボックスをオンにします。

アクセス可能な標準の Google Cloud プロジェクトをスクリプト プロジェクトが使用している場合は、ログに記録された例外を GCP コンソールで表示することもできます。

例外ロギングを有効にする

新しいプロジェクトでは、例外ロギングがデフォルトで有効になっています。古いプロジェクトで例外ロギングを有効にする手順は次のとおりです。

  1. スクリプト プロジェクトを開きます。
  2. 左側にある [プロジェクトの設定] をクリックします。
  3. [捕捉されなかった例外を Cloud Operations にロギングする] チェックボックスをオンにします。

Error Reporting

例外ロギングは、スクリプトによって生成されたエラーを集計して表示する Cloud Error Reporting サービスと自動的に統合されます。Cloud エラーレポートは Google Cloud コンソールに表示できます。[Error Reporting の設定] というプロンプトが表示された場合は、スクリプトがまだ例外をログに記録していないことが原因です。例外ロギングを有効にする以外、設定は必要ありません。

ロギングの要件

組み込みの実行ログを使用するための要件はありません。

Apps Script ダッシュボードで Cloud ログの簡易版を表示できます。ただし、Cloud Logging と Error Reporting を最大限に活用するには、スクリプトの GCP プロジェクトへのアクセス権が必要です。これは、スクリプト プロジェクトが標準の Google Cloud プロジェクトを使用している場合にのみ可能です。