ロギング

アプリを開発する場合、開発中の障害の診断、お客様の問題の特定と診断など、さまざまな目的で情報をログに記録したいと思うことがよくあります。

Apps Script には、ロギングに次の 3 種類のメカニズムが用意されています。

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

  • Play Console の Cloud Logging インターフェース。このインターフェースでは、作成後何日も保持されるログが提供されます。

  • Play Console の 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 か月に 1 回変更されます。ユーザーがデベロッパーの身元をデベロッパーに開示する場合(問題の報告など)に備えます。

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

  • ログには何も追加する必要はありません。すでに入力済みです。
  • ユーザーの承認は必要ありません。
  • ユーザーのプライバシーを保護する。

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

スクリプトで Session.getTemporaryActiveUserKey() を呼び出すことで、一時的なアクティブ ユーザーのキーを取得することもできます。この方法の 1 つの方法は、スクリプトの実行中にユーザーにキーを表示することです。これにより、ユーザーは問題を報告するときにキーを含めることができ、関連するログの特定に役立ちます。

例外ロギング

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

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

  1. Apps Script プロジェクトを開きます。
  2. 左側の [実行数] をクリックします。
  3. 上部にある [フィルタを追加] > [ステータス] をクリックします。
  4. [失敗] と [タイムアウト] のチェックボックスをオンにします。

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

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

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

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

Error Reporting

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

ロギングの要件

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

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