Cloud Logging を VFX レンダリング パイプラインのロギング サーバーとして使用する

このチュートリアルでは、ロギング サーバーではなく Cloud Logging を使用して、アプリケーション固有のロギングを行う方法について説明します。デフォルトでは、Cloud Logging は、システムおよび多くの一般的なアプリケーションからのログを集計します。このチュートリアルでは、カスタム ワークフローや、一般的なアプリケーションのリストに表示されないアプリケーションからログを取得して Cloud Logging に送る方法についても説明します。

ビジュアル エフェクト(VFX)のレンダリング パイプラインやビルドシステムなど、多くのコンピューティング ワークロードでは、存続時間の短いワーカーが一般的です。このチュートリアルでは、VFX ワークロードに焦点を当て、スタンドアロンの VFX レンダラ V-Ray を例として使用します。典型的な使用例の場合、VM インスタンスは、キューイング システムによりオンデマンドで作成され、ジョブ(1 つ以上のフレームをレンダリングするなど)が割り当てられ、ジョブ完了後に終了します。レンダリング プロセスだけでなく、ファイル変換や、レンダリングされたフレームを共通ストレージにローカルにコピーする操作といった、インスタンスによって実行されるレンダリング前またはレンダリング後のジョブからもログを取得する必要があります。

目標

  • インスタンスを作成し、そのインスタンスに Cloud Logging エージェントをインストールする。
  • Cloud Logging エージェントにログを送信するよう、カスタム アプリケーションまたはワークフローを構成する。
  • Python クライアント ライブラリを使用して、直接 Logging にログを送信する。
  • Logging でログを表示、フィルタリング、検索する。
  • Logging から、長期的にアクセス可能なストレージにログをエクスポートする。

費用

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

  • Compute Engine

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただけます。

このチュートリアルでの Logging の使用に伴う費用については、Logging の料金をご覧ください。

始める前に

  1. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    [プロジェクトの選択] ページに移動

  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  3. Compute Engine API を有効にします。

    API を有効にする

  4. gcloud beta コマンド コンポーネントをインストールします。

    gcloud components install beta
  5. デフォルトのプロジェクトを設定します。これにより、コマンドを実行するたびに --project フラグを指定する必要がなくなります。

    gcloud config set project PROJECT_ID

Compute Engine インスタンスの作成

Cloud Logging エージェントは、Compute Engine 仮想マシン(VM)インスタンスと Elastic Compute Cloud(Amazon EC2)VM インスタンスで動作します。エージェントとサポートされる VM インスタンスの詳細については、プロダクト ドキュメントの Logging エージェントをご覧ください。

このチュートリアルでは、デフォルトの VM タイプを使用してインスタンスを作成できます。しかし、本番環境では、アプリケーションに必要なコンピューティング パワーを決定し、それに応じて VM を選択する必要があります。

  1. Cloud Console で、[VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. [インスタンスを作成] をクリックします。
  3. [新しいインスタンスの作成] ページで、インスタンスのプロパティを入力します。 詳細構成オプションで、[管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] セクションを展開します。
  4. [作成] をクリックしてインスタンスを作成します。

新しいインスタンスを作成するには、少し時間がかかります。このチュートリアルの VM インスタンスの名前は sd-tutorial です。

Compute Engine インスタンスの構成

スーパーユーザー権限を付与されたアカウントを使用して VM インスタンスを作成した後、次の手順を実行します。

  1. SSH を使用して sd-tutorial インスタンスに接続します。

    gcloud compute ssh sd-tutorial
  2. Cloud Logging エージェントをインストールします。手順の詳細については、Cloud Logging エージェントをインストールするをご覧ください。

  3. pip をダウンロードして、インストールします。

    sudo yum install python-pip
  4. Cloud Logging Python ライブラリをダウンロードしてインストールします。

    pip install --user --upgrade google-cloud-logging
  5. /etc/google-fluentd/config.d/vray.conf に、次の内容で V-Ray 用の Cloud Logging エージェント構成ファイルを作成します。

    <source>
      @type tail
      read_from_head true
      format /^(\[(?<time>.*?)\])?((?<severity> ?(debug|info|warning|error|critical)): )?(?<message>.*)$/
      time_format %Y/%b/%d|%H:%M:%S
        # Log file names must be of the format SH.SEQ.SHOT.ROLE.log.
        # For example: myfilm.fba.0050.render.log
      path /home/*/vray/logs/*.log
      pos_file /var/lib/google-fluentd/pos/vray.pos
      tag vray.*
    </source>
    <filter vray.**>
      @type record_transformer
      <record>
        # Parse the log file name and add additional key:value records
        # to aid in filtering and searching logs in Logging.
        # Assumes you are following the convention in this tutorial.
        show ${tag_parts[-5]}
        seq ${tag_parts[-4]}
        shot ${tag_parts[-3]}
        role ${tag_parts[-2]}
        tag ${tag_suffix[1]} # Strip off the "vray." prefix.
      </record>
    </filter>
    

    fluentd の構成の詳細については、構成ファイルの構文をご覧ください。

  6. Cloud Logging エージェントの構成を再度読み込みます。

    sudo service google-fluentd reload

    本番環境の場合、パイプラインがオンデマンドで VM を開始できるよう、この構成済みの VM からカスタム VM イメージを作成できます。

VFX についての特別な考慮事項

レンダリング ソフトウェア パッケージごとに、独自のログ出力が生成されます。このチュートリアルでは V-Ray スタンドアロン レンダラを使用していますが、stdout/stderr に出力する他のレンダラまたはアプリケーションにもチュートリアルの内容を適応できます。このチュートリアルでは、一般化された fluentd 構成を使用し、キューイング システムがレンダラの出力を検索に適した特定の形式でファイル名にリダイレクトすることを想定しています。単一の VM で複数のジョブを実行する場合は、ファイル名が確実に一意となるようにする必要があります。

Logging 内のログファイルに名前を付ける

Logging ログの命名規則を定義するときは、スタジオで使用されているおすすめの方法や命名規則に倣います。Logging ではリソース全体からの検索が可能であるため、一貫した命名規則を使用することにより、同じまたは類似のデータでタグ付けされた異なるリソースから生成されたログを検索できるようになります。このチュートリアルにおいてキュー マネージャーは、レンダリング ワーカー プロセスを開始する前に環境変数に次の値を設定します。これらの値は、ログにタグを付けるため、また、一意のファイル名を生成するために使用されます。

フィールド名 環境変数
表示(プロジェクト)名 SHOW myfilm
シーケンス名 SEQ fba
ショット番号 SHOT 0050
役割 ROLE render

この例では、これらの値に基づいて、ビジュアル エフェクト ワークフロー特有の命名規則を構成します。

<SHOW>.<SEQ>.<SHOT>.<ROLE>.log

たとえば、ショット fba0050 のレンダリング ログには、次のようにタグが付けられます。

myfilm.fba.0050.render.log

このチュートリアルでは、キュー マネージャーがこの規則に従ってログファイル名を設定すると想定していますが、スタジオのさまざまなニーズに合わせて変更するのは簡単です。

Logging の構成を手動でテストする

レンダラもキューイング マネージャーも使用せずに構成を確認するには、サンプル ログエントリをテストログにコピーします。ホーム ディレクトリから、次のコマンドを入力します。

mkdir -p vray/logs/
export SHOW='testshow' SEQ='testseq' SHOT='testshot' ROLE='testrole'
echo "debug: Test log line at `date` from ${HOSTNAME}" >> vray/logs/${SHOW}.${SEQ}.${SHOT}.${ROLE}.log

まもなくこの行がログビューアに表示されるはずです。

ログ配信を確認する

  1. Cloud Console で、[ログビューア] ページに移動します。

    ログビューア ページに移動

    [ログ] メニューの下に、作成したログ名のタグが付けられたエントリが表示されます(この場合は testshow.testseq.testshot.testrole)。

  2. このログを表示して、出力を確認します。

    Cloud Logging ログビューア

    また、[project-id][log-name] を適切に置き換えることにより、gcloud ツールのベータ版のコマンドを使用してログを読むこともできます。

    # List all logs.
    gcloud beta logging logs list
    
    # Read the contents of a specific log.
    gcloud beta logging read projects/[project-id]/logs/[log-name]
    

gcloud コマンドライン ツールを使用したロギングの詳細については、ログエントリを読み取るのドキュメントをご覧ください。

レンダリング プロセスから Logging へのログ出力

正しく構成され、検証された場合、次のような V-Ray スタンドアロン コマンドラインを使用することで Logging にログを送信できます。この例の場合、コマンドライン フラグにより、ファイルへのリダイレクト用に出力が最適化された V-Ray プロセスが開始されます。キューイング マネージャーは、SCENE_FILE を、該当するローカル ファイルパスに置き換えるものと想定されています。また、ログファイルに名前を付けるのセクションで説明されているように、ログの名前を生成するために使用される 4 つの環境変数(SHOWSEQSHOTROLE)も設定する必要があります。

vray \
   -display=0 \
   -showProgress=0 \
   -progressUseCR=0 \
   -progressUseColor=0 \
   -sceneFile SCENE_FILE > vray/logs/${SHOW}.${SEQ}.${SHOT}.${ROLE}.log 2>&1

Cloud Logging API への直接ログ出力

ほとんどの VFX パイプラインでは、アセットの準備、公開、データ転送、レンダリング、トランスコードなど、プログラムによるタスクを実行するために、いずれかのスクリプト言語が使用されます。クライアント ライブラリを使用して、これらのタスクの出力を Logging のログに記録できます。このチュートリアルでは、VFX 業界で広く使用されている Python を使用します。

オンプレミスからも、クラウドベースのワークステーションからも Logging にログを送信できます。Logging とは Python API を介して通信するため、このような方法でログを書き込む場合、Logging エージェントはインストールしません。

Python ライブラリを使用して Cloud Logging にログを書き込む

Python スクリプトを使用して Cloud Logging にログを出力するには、まず次の手順を実行する必要があります。

  • ログメタデータを構築します。
  • 重大度を指定します。
  • ログに記録するリソースのタイプを決定します。

スクリプトは次の処理を実行します。

  • 適切な命名規則が使用されることを確認します。
  • ログデータをアセンブルします。
  • Google プロジェクト リソースレベルでログを書き込みます。

オンプレミスのワークステーションまたはサーバーからログを記録する場合は、Logging へのロギングの前に認証が必要です。クラウド インスタンスからログを記録する場合、認証はすでに完了しています。

#!/usr/bin/python
#
# Copyright 2017 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from google.cloud import logging
from google.cloud.logging.resource import Resource
import getpass
import os
import socket

def write(text, severity='INFO', show=None, seq=None, shot=None, role=None, **kwargs):
    '''Wrapper method for assembling the payload to send to logger.log_text.'''

    # Extract and build LOG_ID from environment.
    # For example: 'myfilm.slb.0050.render'
    if not show:
        show = os.getenv('SHOW')
    if not seq:
        seq = os.getenv('SEQ')
    if not shot:
        shot = os.getenv('SHOT')
    if not role:
        role = os.getenv('ROLE')

    if not show or not seq or not shot or not role:
        raise Exception('One or more log name tokens are empty. Unable to log.')
    # end if

    # Assemble logger name.
    logger_name = '.'.join([
        show,
        seq,
        shot,
        role
    ])

    print '# Logging to %s...' % logger_name

    # Build logger object.
    logging_client = logging.Client()
    logger = logging_client.logger(logger_name)

    # Assemble the required log metadata.
    label_payload = {
        "artist" : getpass.getuser(),
        "hostname" : socket.gethostname(),
        "show" : show,
        "seq" : seq,
        "shot" : shot,
        "role" : role
    }

    # Add optional kwargs to payload.
    label_payload.update(kwargs)

    # Write log.
    logger.log_text(
        text,
        resource=Resource(type='project', labels={'project_id':show}),
        severity=severity,
        labels=label_payload
    )

# end write

モジュールをパイプライン内の任意の Python スクリプトにインポートして、オンプレミス アーティスト ワークステーションまたはクラウド インスタンスで実行できます。

import logToStackdriver as lts
lts.write( 'This is the text to log.', show='myfilm', seq='slb', shot='0050', role='render' )

デフォルトでは、すべてのログが、Google Cloud Console の [ロギング] > [ログ] > [Google プロジェクト] にある「project」リソースに書き込まれます。

[Cloud Logging] > [ログ] > [Google プロジェクト]

ログのエクスポート

ログの保持期間を超えてログを保持するには、ログをエクスポートする必要があります。

低額で長期的なストレージを利用するには、ログを Compute Engine バケットにエクスポートします。ビッグデータ分析を実行するには、BigQuery データセットにエクスポートします。いずれの場合も、まずシンクと呼ばれるオブジェクトを作成します。シンクを使用すると、エクスポートするログエントリを選択するフィルタを作成できます。また、宛先として Compute Engine または BigQuery を選択することもできます。シンクを作成するとすぐに、指定されたログが指定された宛先にエクスポートされます。ログビューアでログをエクスポートするには、Cloud Logging API を使用するか、gcloud logging コマンドライン ツールを直接使用します。

BigQuery にエクスポート

BigQuery に格納されたログは、SQL セマンティクスを使用して照会できます。サードパーティ分析ツールの多くは、これらのログをネイティブにサポートしています。手順は次のとおりです。

  1. BigQuery データセットを作成します。

  2. フィルタを使用してシンクを作成し、ログをそのテーブルにエクスポートします。次のコマンドラインでは、[PROJECT_ID] により Google Cloud プロジェクトが参照されていることに注意してください。

    gcloud beta logging sinks create render-errors-bq  \
        bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET] \
        --log-filter "jsonPayload.SHOW=myfilm AND jsonPayload.SHOT=fba AND severity>=WARNING"
    
  3. BigQuery データセットに追加するサービス アカウント名を示すメッセージが表示されます。ウェブ UI を使用するには、データセット名の横にあるプルダウンをクリックし、[共有データセット] をクリックします。

Logging に送信されるもののうち、このフィルタに一致する次のログは、少し遅れてデータセットに送信されます。詳細については、シンクの仕組みのドキュメントを参照してください。

Cloud Storage にエクスポート

ログをファイルに保存するには、それらを Cloud Storage バケットにエクスポートします。Cloud Storage バケットについては、アクセス頻度の低いファイル用の低価格のストレージ クラスを選択するか、または無料使用枠を利用できます。Cloud Storage は、HTTP により、または他の多くの Google Cloud プロダクトとの直接統合によって簡単にアクセスできます。

次の手順は、Cloud Storage にエクスポートする方法を示します。

  1. Cloud Storage バケットを作成します。
  2. Logging で、フィルタを使用してシンクを作成し、それらのログを Cloud Storage にエクスポートします。

    gcloud beta logging sinks create render-errors-gcs  \
        storage.googleapis.com/my-gcs-bucket \
        --log-filter "jsonPayload.SHOW=myfilm AND jsonPayload.SHOT=fba AND severity>=WARNING"
    

Logging に送信されるもののうち、このフィルタに一致する次のログは、少し遅れてバケット中のファイルに送信されます。詳細については、シンクの仕組みのドキュメントを参照してください。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

Compute Engine インスタンスの削除

Compute Engine インスタンスを削除するには:

  1. Cloud Console で、[VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. 削除するインスタンスをクリックします。
  3. [削除] をクリックしてインスタンスを削除します。

Cloud Storage バケットの削除

Cloud Storage バケットを削除するには:

  1. Cloud Console で、[Cloud Storage ブラウザ] ページに移動します。

    Cloud Storage ブラウザページに移動

  2. 削除するバケットのチェックボックスをクリックします。
  3. [削除] をクリックして、バケットを削除します。

次のステップ