在 Java 中记录消息¶
您可以使用 SLF4J API (http://www.slf4j.org/),记录由使用 Java 编写的函数或过程处理程序发出的消息。当您 设置事件表 来存储日志条目时,Snowflake 会将处理程序代码生成的日志条目存储在表中。
您可以使用 Snowflake 上的 Snowflake 遥测库包含的 SLF4J API (http://www.slf4j.org/)。为此,请在创建函数或过程时,在 PACKAGES 子句中包含以下值:com.snowflake:telemetry:latest
。
有关使用 Maven 打包代码时包含遥测库的信息,请参阅 设置 Java 和 Scala 环境以使用遥测类。
备注
使用 Snowflake 遥测库将其他库添加到函数或过程的执行环境中。有关更多信息,请参阅 Snowflake 遥测包依赖项。
备注
SLF4J 不支持 FATAL
级别的日志记录消息。对于用 Java 或 Scala 编写的处理程序,FATAL
级别会被视为 ERROR
级别。
例如,如果将 LOG_LEVEL
参数设置为 FATAL
,就会引入来自 Java 或 Scala 处理程序 ERROR
级别的消息。
有关在 Snowflake 中设置日志记录和检索消息的一般信息,请参阅 来自函数和过程的日志记录消息。
通过代码记录之前,您必须:
Java 示例¶
下面示例中的代码引用了 Snowflake 遥测库,并从中获取了一个日志记录器。它会在 INFO
级别记录一条消息。它还会记录一个异常错误。
有关可用于在特定级别记录日志的方法的更多信息,请参阅 SLF4J 方法 (https://www.slf4j.org/apidocs/org/slf4j/Logger.html)。
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.");
}
}
$$
;
您可以通过对事件表执行 SELECT 命令,来访问日志消息。有关更多信息,请参阅 访问已记录消息的数据。
以下示例中的代码查询存储日志消息的事件表。该查询报告处理程序类中每个日志条目的严重性和消息。
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';
前面的示例生成以下输出。
--------------------------------------------------------
| SEVERITY | MESSAGE |
--------------------------------------------------------
| "INFO" | "Logging from within the constructor." |
--------------------------------------------------------
| "INFO" | "Logging from method start." |
--------------------------------------------------------
| "ERROR" | "Logging an error: Something went wrong." |
--------------------------------------------------------