Cloud Logging als Logging-Server für eine VFX-Rendering-Pipeline verwenden

In dieser Anleitung wird erläutert, wie Sie Cloud Logging anstelle eines Logging-Servers für das anwendungsspezifische Logging verwenden. Cloud Logging aggregiert standardmäßig Logs vom System und von vielen gängigen Anwendungen. In der Anleitung wird auch gezeigt, wie Logs zu benutzerdefinierten Workflows oder Anwendungen, die nicht in der Liste der allgemeinen Anwendungen aufgeführt sind, an Cloud Logging senden.

Kurzlebige Worker sind in vielen Compute-Arbeitslasten üblich, z. B. in Renderingpipelines für visuelle Effekte (VFX) und Build-Systemen. Der Schwerpunkt dieser Anleitung liegt auf den VFX-Arbeitslasten. Als Beispiel wird der eigenständige VFX-Renderer V-Ray verwendet. In einem typischen Anwendungsfall werden VM-Instanzen auf Anforderung von einem Warteschlangensystem erstellt, es wird ihnen ein Auftrag zugewiesen (z. B. das Rendern eines oder mehrerer Frames) und nach Abschluss des Auftrags werden sie beendet. Es müssen nicht nur die Logs des Renderingprozesses erfasst werden, sondern auch die Logs von allen vorher oder nachher gerenderten Jobs, die die Instanz ausführt. Dazu gehört z. B. die Dateikonvertierung oder das Kopieren lokal gerenderter Frames in den gemeinsamen Speicher.

Ziele

  • Eine Instanz erstellen und den Cloud Logging-Agent auf der Instanz installieren.
  • Benutzerdefinierte Anwendung oder Ihren Workflow so konfigurieren, dass Logs an den Cloud Logging-Agent gesendet werden.
  • Python-Clientbibliothek verwenden, um Logs direkt an Logging zu senden.
  • Logs in Logging ansehen, filtern und durchsuchen.
  • Logs aus Logging in langfristig zugänglichen Speicher exportieren.

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

  • Compute Engine

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Unter Logging-Preise finden Sie Informationen zu Ihren Kosten im Zusammenhang mit der Verwendung von Cloud Logging in dieser Anleitung.

Vorbereitung

  1. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  2. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  3. Aktivieren Sie die Compute Engine API.

    Aktivieren Sie die API

  4. Installieren Sie die gcloud beta-Befehlskomponente:

    gcloud components install beta
  5. Legen Sie Ihr Standardprojekt so fest, dass Sie das Flag --project nicht bei jedem Befehl angeben müssen:

    gcloud config set project PROJECT_ID

Compute Engine-Instanz erstellen

Der Cloud Logging-Agent funktioniert auf Compute Engine-VM-Instanzen und Amazon Elastic Compute Cloud-VM-Instanzen (Amazon EC2). Weitere Informationen zum Agent und den unterstützten VM-Instanzen finden Sie unter Logging-Agent in der Produktdokumentation.

Zum Zweck dieser Anleitung können Sie eine Instanz mit einem Standard-VM-Typ erstellen. In der Produktion müssen Sie jedoch entscheiden, wie viel Rechenleistung Ihre Anwendung benötigt, und eine entsprechende VM wählen.

  1. Rufen Sie in der Google Cloud Console die Seite Instanz erstellen auf.

    Zur Seite „Instanz erstellen“

  2. Geben Sie auf der Seite Neue Instanz erstellen die Attribute für Ihre Instanz ein. Maximieren Sie für erweiterte Konfigurationsoptionen den Bereich Verwaltung, Sicherheit, Laufwerke, Netzwerke, einzelne Mandanten.
  3. Klicken Sie auf Erstellen, um die VM zu erstellen.

Das Erstellen der neuen Instanz dauert einen Moment. In dieser Anleitung heißt die VM-Instanz sd-tutorial.

Compute Engine-Instanz konfigurieren

Nachdem Sie die VM-Instanz erstellt haben, führen Sie mit einem Konto, das Superuser-Berechtigungen hat, die folgenden Schritte aus:

  1. Stellen Sie mit SSH eine Verbindung zur Instanz sd-tutorial her.

    gcloud compute ssh sd-tutorial
  2. Installieren Sie den Cloud Logging-Agent. Eine ausführliche Anleitung finden Sie unter Cloud Logging-Agent installieren.

  3. Als Nächstes laden Sie pip herunter und installieren es:

    sudo yum install python-pip
  4. Laden Sie die Cloud Logging-Python-Bibliothek herunter und installieren Sie sie:

    pip install --user --upgrade google-cloud-logging
  5. Erstellen Sie die Konfigurationsdatei des Cloud Logging-Agents für V-Ray unter /etc/google-fluentd/config.d/vray.conf mit folgendem Inhalt:

    <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>
    

    Weitere Informationen zur fluentd-Konfiguration finden Sie unter Syntax der Konfigurationsdatei.

  6. Laden Sie die Konfiguration des Cloud Logging-Agents neu:

    sudo service google-fluentd reload

    In einer Produktionsumgebung könnten Sie nun aus dieser konfigurierten VM ein benutzerdefiniertes VM-Image machen, das Ihre Pipeline bei Bedarf starten kann.

Besondere Überlegungen für VFX

Jedes Rendering-Softwarepaket generiert eine eigene Log-Ausgabe. In dieser Anleitung wird zwar der eigenständige Renderer V-Ray verwendet, sie lässt sich aber auch an andere Renderer oder Anwendungen anpassen, die Ausgaben an stdout/stderr erzeugen. In dieser Anleitung kommt eine allgemeine fluentd-Konfiguration zum Einsatz und es wird davon ausgegangen, dass Ihr Warteschlangensystem die Ausgabe des Renderers an einen Dateinamen mit einem spezifischen, suchfreundlichen Format umleitet. Wenn Sie mehrere Jobs auf einer einzelnen VM ausführen, müssen Sie für eindeutige Dateinamen sorgen.

Log-Dateien in Logging benennen

Befolgen Sie zum Definieren der Namenskonvention für Ihre Logging-Logs die Best Practices für Namenskonventionen Ihres Unternehmens. Logging kann über mehrere Ressourcen hinweg suchen. Durch die Verwendung einer konsistenten Namenskonvention können Sie also nach Logs suchen, die aus verschiedenen Ressourcen generiert wurden, die mit denselben oder ähnlichen Daten gekennzeichnet sind. In dieser Anleitung werden vor dem Starten des Render-Worker-Prozesses vom Warteschlangenmanager die folgenden Werte in Umgebungsvariablen eingefügt, die dann zum Kennzeichnen der Logs und Generieren eindeutiger Dateinamen genutzt werden:

Feldname Umgebungsvariable Wert
Anzeigename (Projektname) SHOW myfilm
Sequenzname SEQ fba
Aufnahmenummer SHOT 0050
Rolle ROLE render

In diesem Beispiel werden diese Werte in einer Namenskonvention zusammengefasst, die für Arbeitsabläufe mit visuellen Effekten typisch ist:

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

So würden die Renderlogs für Aufnahme fba0050 beispielsweise folgendermaßen gekennzeichnet werden:

myfilm.fba.0050.render.log

In dieser Anleitung wird davon ausgegangen, dass der Warteschlangenmanager den Log-Dateinamen gemäß dieser Konvention festlegt. Eine Änderung im Einklang mit den hiervon abweichenden Anforderungen Ihres Studios ist jedoch einfach.

Logging-Konfiguration manuell testen

Zum Prüfen der Konfiguration ohne Einsatz eines Renderers oder eines Warteschlangenmanagers kopieren Sie einen Beispiel-Log-Eintrag in ein Test-Log. Geben Sie in Ihrem Basisverzeichnis die folgenden Befehle ein:

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

Diese Zeile sollte nach kurzer Zeit in der Log-Anzeige erscheinen.

Logzustellung bestätigen

  1. Rufen Sie in der Google Cloud Console die Seite Loganzeige auf.

    Loganzeige aufrufen

    Im Menü Logs sollte ein Eintrag mit dem von Ihnen erstellten Lognamen (in diesem Fall testshow.testseq.testshot.testrole) angezeigt werden.

  2. Zeigen Sie das Log an, um die Ausgabe zu sehen:

    Cloud Logging-Loganzeige

    Sie können Logs auch mit dem Betabefehl des gcloud-Tools lesen. Ersetzen Sie dabei [project-id] und [log-name] entsprechend:

    # 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]
    

Weitere Informationen zum Logging mit dem gcloud-Befehlszeilentool finden Sie in der Dokumentation zum Thema Logeinträge lesen.

Logs von einem Renderprozess an Logging senden

Wenn die Konfiguration korrekt eingerichtet und überprüft wurde, können Sie eine eigenständige V-Ray-Befehlszeile wie die folgende verwenden, um Logs an Logging zu senden. In diesem Beispiel starten die Befehlszeilen-Flags den V-Ray-Prozess mit einer Ausgabe, die für die Umleitung an eine Datei optimiert ist. Es wird davon ausgegangen, dass der Warteschlangenmanager SCENE_FILE durch den entsprechenden lokalen Dateipfad ersetzt. Außerdem werden die vier Umgebungsvariablen (SHOW, SEQ, SHOT und ROLE), mit denen der Name des Logs generiert wird, mit Werten versehen, wie im Abschnitt Logdateien benennen beschrieben.

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

Logs direkt an die Cloud Logging API ausgeben

Die meisten VFX-Pipelines verwenden eine Art von Skriptsprache zur Ausführung von programmatischen Aufgaben wie z. B. Assetvorbereitung, Veröffentlichung, Datenübertragung, Rendering oder Transcodierung. Sie können die Ausgabe dieser Aufgaben mithilfe einer Clientbibliothek in Logging protokollieren. In dieser Anleitung wird mit Python gearbeitet, da Python in der VFX-Branche weit verbreitet ist.

Sie können Logs sowohl von lokalen als auch von cloudbasierten Arbeitsstationen an Logging senden. In diesem Fall installieren Sie den Logging-Agent nicht zum Schreiben von Logs, da die Kommunikation mit Logging über die Python API erfolgt.

Logs mithilfe der Python-Bibliothek an Cloud Logging senden

Bevor Sie Logs mit einem Python-Skript an Cloud Logging senden können, müssen Sie:

  • die Log-Metadaten erstellen,
  • Geben Sie die Wichtigkeitsstufe an.
  • entscheiden, an welche Art von Ressource Logs gesendet werden sollen.

Das Skript führt Folgendes aus:

  • Überprüfung auf die Verwendung der richtigen Namenskonventionen.
  • Zum Zusammenstellen der Log-Daten.
  • Schreiben des Logs auf der Ressourcenebene des Google-Projekts.

Wenn Sie das Logging von einer lokalen Workstation oder einem lokalen Server aus vornehmen, muss vor dem Senden der Logs an Logging eine Authentifizierung erfolgen. Beim Logging über eine Cloudinstanz ist die Authentifizierung bereits abgeschlossen.

#!/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

Sie können das Modul in jedes Python-Skript Ihrer Pipeline importieren und entweder auf einer lokalen Grafikworkstation oder einer Cloudinstanz ausführen:

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

Standardmäßig werden alle Logs in die Projektressource geschrieben, die Sie in der Google Cloud Console unter Logging > Logs > Google-Projekt finden.

Cloud Logging > Logs > Google-Projekt

Export von Logs

Wenn Sie Logs über die Aufbewahrungsdauer von Logs hinaus beibehalten möchten, exportieren Sie die Logs.

Wenn Sie eine kostengünstige, langfristige Speicherung wünschen, exportieren Sie Ihre Logs in Compute Engine-Buckets. Wenn Big Data-Analysen daran durchgeführt werden sollen, exportieren Sie die Logs in ein BigQuery-Dataset. In beiden Fällen erstellen Sie zuerst ein als Senke bezeichnetes Objekt. Dank der Senke können Sie einen Filter für die zu exportierenden Logeinträge erstellen und Compute Engine oder BigQuery als Ziel wählen. Nach dem Erstellen einer Senke werden die angegebenen Logs sofort an das angegebene Ziel exportiert. Sie können Logs in der Loganzeige, über die Cloud Logging API oder direkt über das Befehlszeilentool gcloud loggingexportieren.

Nach BigQuery exportieren

Sie können in BigQuery gespeicherte Logs mithilfe der SQL-Semantik abfragen. Viele Analyseprogramme von Drittanbietern bieten native Unterstützung für diese Logs. Gehen Sie wie folgt vor:

  1. Erstellen Sie ein BigQuery-Dataset.

  2. Erstellen Sie die Senke mit einem Filter für den Export von Logs in diese Tabelle. Beachten Sie, dass sich [PROJECT_ID] in der folgenden Befehlszeile auf Ihr Google Cloud-Projekt bezieht.

    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. Sie erhalten eine Nachricht mit dem Namen des Dienstkontos. Diesen fügen Sie dem BigQuery-Dataset hinzu. Dazu klicken Sie in der Web-UI auf das Drop-down-Menü neben einem Dataset-Namen und dann auf Dataset freigeben.

Das nächste an Logging gesendete Log, das mit diesem Filter übereinstimmt, wird nach einer geringen Verzögerung an das Dataset gesendet. Weitere Details finden Sie in der Dokumentation Funktionsweise von Senken.

Nach Cloud Storage exportieren

Zum Speichern Ihrer Logs in einer Datei exportieren Sie sie in einen Cloud Storage-Bucket. Bei Cloud Storage-Buckets können Sie für Dateien, auf die seltener zugegriffen wird, eine kostengünstigere Speicherklasse auswählen oder das kostenlose Kontingent in Anspruch nehmen. Cloud Storage bietet einfachen Zugriff entweder über HTTP oder durch direkte Integration in viele andere Google Cloud-Produkte.

Die folgenden Schritte zeigen, wie Sie nach Cloud Storage exportieren:

  1. Cloud Storage-Bucket erstellen
  2. Erstellen Sie in Logging eine Senke mit einem Filter, um diese Logs nach Cloud Storage zu exportieren.

    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"
    

Das nächste an Logging gesendete Log, das mit diesem Filter übereinstimmt, wird nach einer geringen Verzögerung an eine Datei im Bucket gesendet. Weitere Details finden Sie in der Dokumentation Funktionsweise von Senken.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten durch Löschen des für die Anleitung erstellten Projekts.

So löschen Sie das Projekt:

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Compute Engine-Instanzen löschen

So löschen Sie eine Compute Engine-Instanz:

  1. Öffnen Sie in der Cloud Console die Seite VM-Instanzen.

    Zu „VM-Instanzen“

  2. Klicken Sie auf das Kästchen für die Die Instanz, die Sie löschen möchten.
  3. Klicken Sie zum Löschen der Instanz auf Weitere Aktionen, dann auf Löschen und folgen Sie der Anleitung.

Cloud Storage-Bucket löschen

So löschen Sie einen Cloud Storage-Bucket:

  1. Wechseln Sie in der Cloud Console zum Cloud Storage-Browser.

    Browser aufrufen

  2. Klicken Sie auf das Kästchen neben dem Bucket, der gelöscht werden soll.
  3. Klicken Sie zum Löschen des Buckets auf Löschen und folgen Sie der Anleitung.

Nächste Schritte