Registro de mensagens em Java

É possível registrar mensagens de um manipulador de função ou procedimento escrito em Java usando a API SLF4J. Quando você configura uma tabela de eventos para armazenar entradas de log, o Snowflake armazena na tabela as entradas de log geradas pelo seu código do manipulador.

Você pode usar a API SLF4J incluída na biblioteca Snowflake Telemetry incluída no Snowflake. Para fazer isso, inclua o seguinte valor na cláusula PACKAGES ao criar a função ou o procedimento: com.snowflake:telemetry:latest.

Para obter mais informações sobre como incluir a biblioteca de telemetria ao empacotar seu código com Maven, consulte Configurando seu ambiente Java e Scala para usar a classe de telemetria.

Nota

O uso da biblioteca de telemetria do Snowflake adiciona outras bibliotecas ao ambiente de execução de sua função ou procedimento. Para obter mais informações, consulte Dependências do pacote de telemetria do Snowflake.

Nota

SLF4J não oferece suporte ao registro de mensagens no nível FATAL. Para manipuladores escritos em Java ou Scala, o nível FATAL é tratado como o nível ERROR.

Por exemplo, se você definir o parâmetro LOG_LEVEL como FATAL, as mensagens de nível ERROR de um manipulador Java ou Scala serão ingeridas.

Para obter informações gerais sobre a configuração de registro e recuperação de mensagens no Snowflake, consulte Registro de mensagens de funções e procedimentos.

Antes de fazer o registro a partir do código, você deve:

  • Configurar uma tabela de eventos para coletar mensagens registradas do código do manipulador.

    Para obter mais informações, consulte Configuração de uma tabela de eventos.

  • Certifique-se de que o nível de registro em log esteja definido para que as mensagens desejadas sejam armazenadas na tabela de eventos.

    Para obter mais informações, consulte Configuração do nível de registro.

Exemplo em Java

O código no exemplo a seguir importa referências da biblioteca Snowflake Telemetry e, a partir dela, obtém um agente de log. Ele registra uma mensagem no nível INFO. Ele também registra um erro para uma exceção.

Para obter mais informações sobre os métodos que podem ser usados para registrar em níveis específicos, consulte métodos 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

Você pode acessar as mensagens de log executando um comando SELECT na tabela de eventos. Para obter mais informações, consulte Acesso a dados de mensagens registradas.

O código no exemplo a seguir consulta a tabela de eventos onde as mensagens de log estão armazenadas. A consulta informa sobre a gravidade e a mensagem de cada entrada de log da classe do manipulador.

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

O exemplo anterior gera a seguinte saída.

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