Registro de mensagens no Snowflake Scripting

É possível registrar mensagens de um manipulador de função ou procedimento escrito no Script Snowflake usando a função SYSTEM$LOG, SYSTEM$LOG_<nível> (para Script Snowflake) do Snowflake. 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.

Antes de fazer o registro a partir do código, 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 Definição de níveis para registro, métricas e rastreamento.

Nota

Antes de começar a registrar mensagens, é necessário configurar uma tabela de eventos. Para obter mais informações, consulte Visão geral da tabela de evento.

Você pode acessar as mensagens de log executando um comando SELECT na tabela de eventos. Para obter mais informações, consulte Visualização de mensagens de log.

Para obter informações gerais sobre como configurar o registro e recuperar mensagens no Snowflake, consulte Registro de mensagens de funções e procedimentos.

Exemplo de Snowflake Scripting

O código no exemplo a seguir usa a função SYSTEM$LOG para registrar mensagens em cada um dos níveis suportados. Observe que uma mensagem registrada a partir do código que processa uma linha de entrada será registrada para cada linha processada pelo manipulador. Se o manipulador for executado em uma tabela grande, isso poderá resultar em um grande número de mensagens na tabela de eventos.

-- The following calls are equivalent.
-- Both log information-level messages.
SYSTEM$LOG('info', 'Information-level message');
SYSTEM$LOG_INFO('Information-level message');

-- The following calls are equivalent.
-- Both log error messages.
SYSTEM$LOG('error', 'Error message');
SYSTEM$LOG_ERROR('Error message');


-- The following calls are equivalent.
-- Both log warning messages.
SYSTEM$LOG('warning', 'Warning message');
SYSTEM$LOG_WARN('Warning message');

-- The following calls are equivalent.
-- Both log debug messages.
SYSTEM$LOG('debug', 'Debug message');
SYSTEM$LOG_DEBUG('Debug message');

-- The following calls are equivalent.
-- Both log trace messages.
SYSTEM$LOG('trace', 'Trace message');
SYSTEM$LOG_TRACE('Trace message');

-- The following calls are equivalent.
-- Both log fatal messages.
SYSTEM$LOG('fatal', 'Fatal message');
SYSTEM$LOG_FATAL('Fatal message');
Copy

Como adicionar automaticamente mensagens de log sobre blocos e trabalhos secundários

Você pode registrar automaticamente as seguintes informações adicionais sobre a execução de um procedimento armazenado do Snowflake Scripting:

  • BEGIN/END de um bloco Snowflake Scripting.

  • BEGIN/END de uma solicitação de trabalho secundário.

O registro em log automático é destinado aos seguintes casos de uso:

  • Você deseja gerar as mensagens de log adicionais sem modificar o corpo do procedimento armazenado.

  • Você deseja obter informações abrangentes sobre a execução do procedimento armazenado.

  • Você deseja ter mais visibilidade da execução do procedimento armazenado para facilitar o desenvolvimento e a depuração sem adicionar manualmente o código de registro no procedimento.

Para registrar automaticamente essas mensagens do Snowflake Scripting para um procedimento armazenado, defina o parâmetro AUTO_EVENT_LOGGING para o procedimento armazenado como LOGGING ou ALL usando o comando ALTER PROCEDURE. Quando você define esse parâmetro como ALL, eventos de rastreamento adicionais também são emitidos automaticamente para o procedimento armazenado.

Importante

As informações adicionais são adicionadas à tabela de eventos somente se o LOG_LEVEL efetivo estiver definido como TRACE. Para obter mais informações, consulte Definição de níveis para registro, métricas e rastreamento.

Por exemplo, crie uma tabela simples e insira os dados:

CREATE OR REPLACE TABLE test_auto_event_logging (id INTEGER, num NUMBER(12, 2));

INSERT INTO test_auto_event_logging (id, num) VALUES
  (1, 11.11),
  (2, 22.22);
Copy

Em seguida, crie um procedimento armazenado chamado auto_event_logging_sp. Esse procedimento armazenado de exemplo atualiza uma linha da tabela e, em seguida, consulta a tabela:

CREATE OR REPLACE PROCEDURE auto_event_logging_sp(
  table_name VARCHAR,
  id_val INTEGER,
  num_val NUMBER(12, 2))
RETURNS TABLE()
LANGUAGE SQL
AS
$$
BEGIN
  UPDATE IDENTIFIER(:table_name)
    SET num = :num_val
    WHERE id = :id_val;
  LET res RESULTSET := (SELECT * FROM IDENTIFIER(:table_name) ORDER BY id);
  RETURN TABLE(res);
EXCEPTION
  WHEN statement_error THEN
    res := (SELECT :sqlcode sql_code, :sqlerrm error_message, :sqlstate sql_state);
    RETURN TABLE(res);
END;
$$
;
Copy

Os exemplos a seguir definem o parâmetro AUTO_EVENT_LOGGING para o procedimento armazenado:

ALTER PROCEDURE auto_event_logging_sp(VARCHAR, INTEGER, NUMBER)
  SET AUTO_EVENT_LOGGING = 'LOGGING';
Copy
ALTER PROCEDURE auto_event_logging_sp(VARCHAR, INTEGER, NUMBER)
  SET AUTO_EVENT_LOGGING = 'ALL';
Copy

Chame o procedimento armazenado:

CALL auto_event_logging_sp('test_auto_event_logging', 2, 33.33);
Copy
+----+-------+
| ID |   NUM |
|----+-------|
|  1 | 11.11 |
|  2 | 33.33 |
+----+-------+

Consulte na tabela de eventos as mensagens registradas pelo procedimento armazenado denominado auto_event_logging_sp. Para cada mensagem, imprima o carimbo de data/hora, o nível de log e o texto da mensagem.

SELECT
    TIMESTAMP as time,
    RECORD['severity_text'] as severity,
    VALUE as message
  FROM
    my_db.public.my_events
  WHERE
    RESOURCE_ATTRIBUTES['snow.executable.name'] LIKE '%AUTO_EVENT_LOGGING_SP%'
    AND RECORD_TYPE = 'LOG';
Copy
+-------------------------+----------+----------------------------------+
| TIME                    | SEVERITY | MESSAGE                          |
|-------------------------+----------+----------------------------------|
| 2024-10-25 20:42:24.134 | "TRACE"  | "Entering outer block at line 2" |
| 2024-10-25 20:42:24.135 | "TRACE"  | "Entering block at line 2"       |
| 2024-10-25 20:42:24.135 | "TRACE"  | "Starting child job"             |
| 2024-10-25 20:42:24.633 | "TRACE"  | "Ending child job"               |
| 2024-10-25 20:42:24.633 | "TRACE"  | "Starting child job"             |
| 2024-10-25 20:42:24.721 | "TRACE"  | "Ending child job"               |
| 2024-10-25 20:42:24.721 | "TRACE"  | "Exiting with return at line 7"  |
+-------------------------+----------+----------------------------------+