Salesforceでイベントログを取得する

Salesforceのログ機能

「Salesforceで詳細なログを取りたい」 ユーザにそんな要望を言われて困ったことはないでしょうか?

今まで管理者が取得できるログ・履歴には以下のようなものがありました。

  • ■ デバッグログ
  • ■ ログイン履歴
  • ■ メールログ
  • ■ 設定変更履歴
  • ■ 項目履歴
  • ■ 最終更新日、更新者

上記以外にもsalesforce.com社側で詳細なログを取得しているようですが、これは問題発生時にsalesforce.com社が確認するのがメインの目的なので、ユーザ側の管理者が簡単に閲覧できるものではありません。 それでは、詳細なログを取得するにはどうしたら良いでしょうか?

Winter'15で正式リリースとなったEvent Log Filesの機能を使えば、今までより詳細なユーザのイベントログを取得することができます。 今日はそのEvent Log Filesの概要と取得方法について書きたいと思います。

Event Log Filesの概要

イベントログファイルを簡単に説明すると以下のような機能です。

  • ■ ログが記載されたcsvファイルをSOAP、RESTのAPIで取得したり、Apexでも"EventLogFile"へのSOQLクエリを実行することで取得可能
  • ■ Salesforce UI(設定画面等)からは閲覧できない
  • ■ ログレコードは0時~23時59分(UTCタイムゾーン)のイベントタイプごとに生成される
  • ■ 取得可能なログのイベントタイプは現在28種類ある
  • ■ ログレコードは翌日のピーク時間以外に自動生成される(日によって結構バラバラっぽい)
  • ■ イベントが1つも発生しない場合、ログレコードは生成さない
  • ■ ログレコードの期限はEE以上は作成されてから30日、DEでは1日となる(一応自分のDEでは50日前のログレコードも残っているようです)

ようするにイベントログファイルはアクションがあった翌日に作成され、REST,SOQPのAPIやApexで取得します。 ファイルはイベント毎、日毎に作成されるのでEventLogFileのレコードとcsvは以下のようなイメージになります。 なお、EventLogFileにアクセスするには「全てのデータの参照権限」または「イベントログファイルを参照」権限が必要になります。

レコードについて

まず、sObjectのEventLogFileには以下の項目があります。

  • ・CreatedById
  • ・CreatedDate
  • EventType
  • ・Id
  • ・IsDeleted
  • ・LastModifiedById
  • ・LastModifiedDate
  • LogDate
  • LogFile
  • LogFileContentType
  • LogFileLength
  • SystemModstamp

これらの中でログに関連する項目を見ていきましょう。

EventType

 現在取得可能なイベントは28種類で、それらのタイプが入っています。

  • Apex コールアウト
  • Apex 実行
  • Apex SOAP
  • Apex トリガ
  • API
  • 非同期レポート
  • Bulk API
  • 変更セット操作
  • コンテンツ配布
  • コンテンツドキュメントリンク
  • コンテンツ転送
  • ダッシュボード
  • ドキュメント添付ファイルのダウンロード
  • ログイン
  • 別名でログイン
  • ログアウト
  • MDAPI 操作(メタデータAPIと思われる)
  • マルチブロックレポート(結合レポートと思われる)
  • パッケージのインストール
  • レポート
  • レポートのエクスポート
  • REST API
  • Salesforce1 UI Tracking
  • Sandbox
  • サイト
  • 時間ベースのワークフロー
  • URI
  • Visualforce

LogDate

 CreateDateはsObjectレコードが作成された日付ですが、LogDateはログ対象の日付です。

LogFile

 Base64型の項目で、ログの詳細となるcsvが保存されています。

LogFileContentType

 LogFileのコンテンツタイプ。常に"text/csv"です。

LogFileLength

 byte単位でログファイルのサイズが入っています。  ユーザ数や操作数が多い組織では、当然ながらファイルサイズも大きくなります。

ログの取得方法

概要で書いた通り、SOAPやREST APIやApexからSOQLクエリを投げて取得することができます。

今回は開発者向けのツールであるWorkbenchのREST Explorerを使い、REST API経由でEventLogを取得してみます。 ここではREST APIの開発者ガイドに沿って説明します。

まずはWorkbenchのサイトを表示します。 https://workbench.developerforce.com/login.php API Versionは最新にしてログインします。 画面上部のメニューからutilities>REST Explorerを選択し、テキストボックスに次のように入力してGETで実行します。

/services/data/v32.0/query?q=Select+e.SystemModstamp,+e.LogFileLength,+e.LogFileContentType,+e.LogDate,+e.LastModifiedDate,+e.LastModifiedById,+e.IsDeleted,+e.Id,+e.EventType,+e.CreatedDate,+e.CreatedById,+e.LogFile+From+EventLogFile+e+order+by+logdate+desc


これでログインした組織のEventLogFileレコードが取得できます。

※エラーになる場合はユーザの権限がない、またはEventLogFilesが使えない組織である可能性があります

※1件もない場合はログが作成されていない、または期日経過でログがないと思われます

recordsを展開して適当なレコードを選択すると、EventLogFileレコードの情報が表示されます。

実際にログファイル(csv)を取得するには、以下の形式のリクエストを投げます。

/services/data/v32.0/sobjects/EventLogFile/[EventLogFileレコードID]/LogFile


ここでは展開したレコードのリンクから投げることができるので、LogFileのリンクをクリックします。 すると画面にcsvを含めたレスポンスが表示されます。 このcsvがログの詳細になります。

ログファイルについて

csvの中身ですが、どのEventTypeにも共通する項目と、それぞれのEventType毎に用意されている項目があります。 ここでは雰囲気程度にいくつかの項目を紹介します。

    • ■ USER_ID

イベントを起こしたSalesforce UserのID。

    • ■ TIMESTAMP

イベントを起こした日時(UTC)。

    • ■ EVENT_TYPE

28種類のイベントタイプ。ファイル自体分かれているが、ファイル内にも情報はある。

    • ■ URI

要求したページのURI。相対パスになる。 例:/09D/e、/09DA0000000MmEH、/p/setup/field/NewCustomFieldStageManager

    • ■ CLIENT_IP

イベントを要求したクライアントのIPアドレス。

    • ■ RUN_TIME

その名の通りランタイム。重い処理を探すのに役立ちそう。

    • ■ APEX_TRIGGER_EVENT

トリガのイベント。 例:BeforeInsert、AfterInsert

    • ■ VIEW_STATE_SIZE

その名の通り、ビューステートのサイズ。

    • ■ METHOD_NAME

APIで使われたメソッド名 例:query、describe、retrieve、updateなど

    • ■ API_TYPE

APIの種類。 省略形で"R"とか"S"という値になっているが、REST APIやSOAP APIのことと思われる。

    • ■ API_VERSION

その名の通り、要求されたAPIのバージョン。

    • ■ USER_INITIATED_LOGOUT

ログアウトイベントの種類。"0"か"1"で表示され、1はユーザがログアウトリンクなど明確にログアウトした場合、0はその他自動的にログアウトされた場合と思われる。

    • ■ OPERATION_TYPE

パッケージイベントの種類。 例:INSTALL、UPGRADE、UNINSTALL、VALIDATE_PACKAGE

    • ■ REQUEST_TYPE

EventTypeがVsiauflforceの場合、Visualforceのリクエストの種類。通常ページ要求やApexからの呼び出し、PDF形式の呼び出し等が分かる。

ここで紹介した項目はほんの一部であり、他にもEventTypeごとに様々な情報を取得することができます。 ただし、残念ながら項目に関する説明が記載された公式のドキュメントがないので、現状はおおよその予想をしながら解析していくことになりそうです。

最後に

イベントログファイルを取得することで、より詳細なログが取得できるようになります。監査目的で利用したり、開発者がレスポンスに問題がある処理を探すなど、様々な目的で利用できそうです。

ただし、以下の点には注意が必要です。

・厳密なレコードの参照ログを取ることはできない。  例えばビューやレポートでレコードの一覧を表示したイベントで、どのレコードを参照したか、とか  Visualforceでの開発画面でも同じことが言える

・28種類のイベントタイプに該当しないものはログが残らない  例えばSalesforceにリクエストを投げない、クライアント側だけで完結するイベントとか ・DE以外の組織では現在のところ有償オプション(!)

なお、今回の記事は「Salesforce1 Advent Calendar 2014」の10日目に参加しています。