Enregistrement des messages en Java

Vous pouvez enregistrer des messages à partir d’une fonction ou d’un gestionnaire de procédure écrit en Java en utilisant l”API SLF4J. Lorsque vous avez mis en place une table d’événements pour stocker les entrées de journal, Snowflake stocke les entrées de journal générées par votre code de gestionnaire dans la table.

Vous pouvez utiliser l”API SLF4J incluse dans la bibliothèque de télémétrie Snowflake incluse dans Snowflake. Pour ce faire, incluez la valeur suivante dans la clause PACKAGES lorsque vous créez la fonction ou la procédure : com.snowflake:telemetry:latest.

Pour plus d’informations sur l’inclusion de la bibliothèque de télémétrie lors de l’empaquetage de votre code avec Maven, reportez-vous à Configuration de votre environnement Java et Scala pour l’utilisation de la classe de télémétrie.

Note

L’utilisation de la bibliothèque de télémétrie Snowflake ajoute d’autres bibliothèques à l’environnement d’exécution de votre fonction ou procédure. Pour plus d’informations, reportez-vous à Dépendances du paquet de télémétrie Snowflake.

Note

SLF4J ne prend pas en charge les messages de journalisation au niveau FATAL. Pour les gestionnaires écrits en Java ou Scala, le niveau FATAL est traité comme le niveau ERROR.

Par exemple, si vous définissez le paramètre LOG_LEVEL sur FATAL, les messages de niveau ERROR provenant d’un gestionnaire Java ou Scala sont pris en compte.

Pour des informations générales sur la configuration de la journalisation et la récupération des messages dans Snowflake, reportez-vous à Enregistrement de messages à partir de fonctions et de procédures.

Avant de journaliser à partir d’un code, vous devez :

  • Mettre en place une table d’événements pour collecter les messages enregistrés par le code du gestionnaire.

    Pour plus d’informations, reportez-vous à Configuration d’une table d’événement.

  • Assurez-vous que le niveau de journalisation est défini de manière à ce que les messages souhaités soient stockés dans la table d’événements.

    Pour plus d’informations, reportez-vous à Réglage du niveau de journalisation.

Exemple Java

Le code de l’exemple suivant fait référence à la bibliothèque de télémétrie Snowflake et obtient un enregistreur à partir de celle-ci. Il enregistre un message au niveau INFO. Il enregistre également une erreur en cas d’exception.

Pour plus d’informations sur les méthodes que vous pouvez utiliser pour enregistrer à des niveaux spécifiques, reportez-vous aux méthodes SLF4J.

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

  public class JavaLoggingHandler {
    private static Logger logger = LoggerFactory.getLogger(JavaLoggingHandler.class);

    public JavaLoggingHandler() {
      logger.info("Logging from within the constructor.");
    }

    public String doThings(Session session) {
      logger.info("Logging from method start.");

      try {
        throwException();
      } catch (Exception e) {
        logger.error("Logging an error: " + e.getMessage());
        return "ERROR";
      }
      return "SUCCESS";
    }

    // Simulate a thrown exception to catch.
    private void throwException() throws Exception {
      throw new Exception("Something went wrong.");
    }
  }
$$
;
Copy

Vous pouvez accéder aux messages du journal en exécutant une commande SELECT sur la table d’événements. Pour plus d’informations, reportez-vous à Accès aux données des messages enregistrés.

Le code de l’exemple suivant interroge la table d’événements dans laquelle sont stockés les messages du journal. La requête indique la gravité et le message de chaque entrée de journal de la classe du gestionnaire.

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'] = 'JavaLoggingHandler'
  AND RECORD_TYPE = 'LOG';
Copy

L’exemple précédent génère la sortie suivante.

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