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 informações sobre como incluir a biblioteca Telemetry ao empacotar seu código com o Maven, consulte Configuração do 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 como configurar o registro e recuperar 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 Visão geral da tabela de evento.
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.
Adição de atributos personalizados¶
Ao criar uma entrada de log, é possível adicionar seus próprios atributos em pares chave-valor. O Snowflake salva esses atributos personalizados na coluna RECORD_ATTRIBUTES da tabela de evento.
Para adicionar atributos personalizados, chame os métodos da API slf4j fluent, como Logger.atInfo
e Logger.atError
. Use estes métodos para definir os pares chave-valor na entrada de log. Cada um retorna um org.slf4j.spi.LoggingEventBuilder, que é possível usar para definir a mensagem de log.
O código no exemplo a seguir registra a mensagem “Registro com atributos” na coluna VALUE da tabela de evento. Ele também adiciona um atributo personalizado à coluna RECORD_ATTRIBUTES.
CREATE OR REPLACE PROCEDURE do_logging_java()
RETURNS VARCHAR
LANGUAGE JAVA
RUNTIME_VERSION = '11'
PACKAGES = ('com.snowflake:telemetry:latest','com.snowflake:snowpark: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 String doThings(Session session) {
logger.atInfo().addKeyValue("custom1", "value1").setMessage("Logging with attributes").log();
return "SUCCESS";
}
}
$$;
A saída desta chamada Logger.atInfo
aparece na tabela de evento da seguinte forma. Observe que a coluna RECORD_ATTRIBUTES incluirá atributos que o Snowflake adiciona automaticamente.
------------------------------------------------------------------
| VALUE | RECORD_ATTRIBUTES |
------------------------------------------------------------------
| "Logging with attributes" | { |
| | "custom1": "value1", |
| | "thread.name": "Thread-5" |
| | } |
------------------------------------------------------------------
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 é possível usar para log em níveis específicos, consulte os 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.");
}
}
$$
;
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.
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';
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." |
--------------------------------------------------------