Registro de mensagens em Python

É possível registrar mensagens de um manipulador de função ou procedimento escrito em Python usando logging, o módulo de registro na biblioteca padrão do Python. 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.

Para obter mais informações sobre os níveis de registro em log suportados pelo Python, consulte a documentação de níveis de registro em log. Observe que o Snowflake trata dois dos níveis de registro em log do Python de uma maneira específica:

  • O nível Python CRITICAL será tratado como FATAL.

  • O nível Python NOTSET será tratado como TRACE.

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.

Substituição dos níveis de limite de log com Python

Você pode usar o código do manipulador Python para substituir os níveis de limite de log que foram definidos com SQL. Ao definir o nível de registro com Python, as entradas de log usarão os níveis de registro em log definidos pelo Python.

Ao definir níveis de log em Python, você pode fazer o seguinte:

  • Substitua o limite definido para a sessão do Snowflake ou para objetos como o procedimento ou UDF.

  • Defina limites com escopo para pacotes Python especificados.

    logPor exemplo, você pode usar o nome do registrador de logs definido (e que está armazenado na tabela de eventos) para definir um limite para esse registrador de logs com Python.

O código Python no exemplo a seguir define o nível de log do pacote Snowpark session como DEBUG.

session_logger = logging.getLogger('snowflake.snowpark.session')
session_logger.setLevel(logging.DEBUG)
Copy

Como usar o nome do registrador de logs para definir o nível de registro em log

É possível usar o nome do registrador de logs registrado na tabela de eventos para configurar um limite para entradas de log desse registrador de logs. Isso pode ser útil quando você deseja definir o limite de um registrador de logs para que ele filtre entradas de log indesejadas acima de um nível específico.

Para fazer isso, primeiro você consultaria a tabela de eventos para descobrir o nome do registrador de logs associado às entradas para as quais deseja capturar um nível de registro em log diferente. Então, usando esse nome de registrador de logs, você definiria o nível de log para o limite desejado.

O código no exemplo a seguir consulta entradas de log, incluindo o nome do registrador de logs nos dados retornados. Você pode obter o nome como o valor da coluna Escopo.

SET event_table_name='my_db.public.my_event_table';

SELECT
  TIMESTAMP as time,
  RECORD['severity_text'] as log_level,
  SCOPE['name'] as logger_name,
  VALUE as message
FROM
  IDENTIFIER($event_table_name)
WHERE
  RECORD_TYPE = 'LOG';
Copy

Esta consulta pode retornar muitas entradas de vários registradores de logs. Se, depois de analisar os resultados, você decidir que está recebendo muitas mensagens INFO que não deseja do registrador de logs numpy, poderá usar Python para definir o limite desse registrador de logs para capturar entradas de log no nível ERROR e acima.

numpy_logger = logging.getLogger('numpy_logs')
numpy_logger.setLevel(logging.ERROR)
Copy

Para obter mais informações sobre como consultar a tabela de eventos, consulte Acesso a dados de mensagens registradas.

Exemplo em Python

O código no exemplo a seguir importa o módulo logging, obtém um agente de registro e registra uma mensagem no nível INFO.

Para obter mais informações sobre os níveis de registro em log suportados pelo Python, consulte a documentação de níveis de registro em log.

CREATE OR REPLACE PROCEDURE do_logging()
RETURNS VARCHAR
LANGUAGE PYTHON
PACKAGES=('snowflake-snowpark-python')
RUNTIME_VERSION=3.8
HANDLER='do_things'
AS $$
import logging

logger = logging.getLogger("python_logger")
logger.info("Logging from Python module.")

def do_things(session):
  logger.info("Logging from Python function start.")

  try:
    throw_exception()
  except Exception:
    logger.error("Logging an error from Python handler: ")
    return "ERROR"

  return "SUCCESS"

def throw_exception():
  raise 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'] = 'python_logger'
  AND RECORD_TYPE = 'LOG';
Copy

O exemplo anterior gera a seguinte saída.

---------------------------------------------------------------------------
| SEVERITY | MESSAGE                                                      |
---------------------------------------------------------------------------
| "INFO"   | "Logging from Python module."                                |
---------------------------------------------------------------------------
| "INFO"   | "Logging from Python function start."                        |
---------------------------------------------------------------------------
| "ERROR"  | "Logging an error from Python handler."                      |
---------------------------------------------------------------------------