Protokollierung von Meldungen in Scala

Sie können Meldungen von einem in Scala geschriebenen Funktions- oder Prozedur-Handler protokollieren, indem Sie die SLF4J-API verwenden. Wenn Sie eine Ereignistabelle zum Speichern von Protokolleinträgen eingerichtet haben, speichert Snowflake die von Ihrem Handler-Code generierten Protokolleinträge in dieser Tabelle.

Sie können die SLF4J-API verwenden, die in der Snowflake-Telemetrie-Bibliothek enthalten ist, die von Snowflake bereitgestellt wird. Um dies zu tun, fügen Sie beim Erstellen der Funktion oder Prozedur den folgenden Wert in die PACKAGES-Klausel ein: com.snowflake:telemetry:latest.

Weitere Informationen zum Einbinden der Telemetrie-Bibliothek beim Packen Ihres Codes mit Maven finden Sie unter Einrichten Ihrer Java- und Scala-Umgebung für die Verwendung der Telemetrie-Klasse.

Bemerkung

Durch Verwendung der Snowflake-Telemetrie-Bibliothek werden der Ausführungsumgebung Ihrer Funktion oder Prozedur weitere Bibliotheken hinzugefügt. Weitere Informationen dazu finden Sie unter Abhängigkeiten des Snowflake-Telemetrie-Pakets.

Bemerkung

SLF4J unterstützt keine Protokollierungsmeldungen des Schweregrads FATAL. Bei Handlern, die in Java oder Scala geschrieben sind, wird der Schweregrad FATAL wie der Schweregrad ERROR behandelt.

Wenn Sie z. B. den Parameter LOG_LEVEL auf FATAL setzen, werden Meldungen des Schweregrads ERROR von einem Java- oder Scala-Handler erfasst.

Allgemeine Informationen zum Einrichten der Protokollierung und zum Abrufen von Meldungen in Snowflake finden Sie unter Protokollierung von Meldungen aus Funktionen und Prozeduren.

Bevor Sie die Protokollierung für Code nutzen können, müssen Sie Folgendes tun:

  • Einrichten einer Ereignistabelle, in der von Handler-Code protokollierte Meldungen gesammelt werden.

    Weitere Informationen dazu finden Sie unter Einrichten einer Ereignistabelle.

  • Sicherstellen, dass der Protokolliergrad so eingestellt ist, dass die gewünschten Meldungen in der Ereignistabelle gespeichert werden.

    Weitere Informationen dazu finden Sie unter Einstellen des Protokolliergrads.

Scala-Beispiel

Der Code im folgenden Beispiel importiert Verweise auf die Snowflake-Telemetrie-Bibliothek und ruft von dort einen Logger ab. Er protokolliert eine Meldung des Schweregrads INFO. Es wird auch ein Fehler für eine Ausnahme protokolliert.

Weitere Informationen zu den Methoden, die Sie für die Protokollierung bei bestimmten Schweregraden verwenden können, finden Sie unter SLF4J-Methoden.

CREATE OR REPLACE PROCEDURE do_logging()
RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = '2.12'
PACKAGES=('com.snowflake:snowpark:latest', 'com.snowflake:telemetry:latest')
HANDLER = 'ScalaLoggingHandler.doThings'
AS
$$
  import org.slf4j.Logger
  import org.slf4j.LoggerFactory
  import com.snowflake.snowpark.Session

  class ScalaLoggingHandler {
    private val logger: Logger = LoggerFactory.getLogger(getClass)

    logger.info("Logging from within the Scala constructor.")

    def doThings(session: Session): String = {
      logger.info("Logging from Scala method start.")

      try {
        throwException
      } catch {
        case e: Exception => logger.error("Logging an error from Scala handler: " + e.getMessage())
        return "ERROR"
      }
      return "SUCCESS"
    }

    // Simulate a thrown exception to catch.
    @throws(classOf[Exception])
    private def throwException = {
      throw new Exception("Something went wrong.")
    }
  }
$$
;
Copy

Sie können auf die Protokollmeldungen zugreifen, indem Sie einen SELECT-Befehl auf der Ereignistabelle ausführen. Weitere Informationen dazu finden Sie unter Zugriff auf protokollierte Meldungsdaten.

Der Code im folgenden Beispiel fragt die Ereignistabelle ab, in der die Protokollmeldungen gespeichert sind. Die Abfrage gibt den Schweregrad und die Meldung jedes Protokolleintrags der Handler-Klasse zurück.

SET event_table_name='my_db.public.my_event_table';

SELECT
  RECORD['severity_text'] AS SEVERITY,
  VALUE AS MESSAGE
FROM
  IDENTIFIER($event_table_name)
WHERE
  SCOPE['name'] = 'ScalaLoggingHandler'
  AND RECORD_TYPE = 'LOG';
Copy

Das vorherige Beispiel generiert die folgende Ausgabe.

---------------------------------------------------------------------------
| SEVERITY | MESSAGE                                                      |
---------------------------------------------------------------------------
| "INFO"   | "Logging from within the Scala constructor."                 |
---------------------------------------------------------------------------
| "INFO"   | "Logging from Scala method start."                           |
---------------------------------------------------------------------------
| "ERROR"  | "Logging an error from Scala handler: Something went wrong." |
---------------------------------------------------------------------------