Javaでのメッセージのログ¶
SLF4J API を使用すると、Javaで記述された関数またはプロシージャハンドラーからのメッセージをログできます。ログエントリを格納する イベントテーブルを設定 すると、Snowflakeはハンドラーコードによって生成されたログエントリをテーブルに格納します。
Snowflakeに含まれているSnowflakeテレメトリライブラリにある SLF4J API を使用できます。これを実行するには、関数またはプロシージャを作成するときに、値 com.snowflake:telemetry:latest
を PACKAGES 句に含めます。
Mavenでコードをパッケージ化するときにテレメトリライブラリを含める方法については、 テレメトリクラスを使用するためのJavaおよびScala環境の設定 をご参照ください。
注釈
Snowflakeテレメトリライブラリを使用すると、関数またはプロシージャの実行環境に他のライブラリが追加されます。詳細については、 Snowflakeテレメトリパッケージの依存関係 をご参照ください。
注釈
SLF4J は、 FATAL
レベルでのメッセージのログをサポートしていません。JavaまたはScalaで記述されたハンドラーの場合、 FATAL
レベルは ERROR
レベルとして扱われます。
たとえば、 LOG_LEVEL
パラメーターを FATAL
に設定すると、JavaまたはScalaハンドラーからの ERROR
レベルのメッセージがインジェストされます。
Snowflakeでのログの設定とメッセージの取得に関する一般的な情報については、 関数とプロシージャからのメッセージのログ をご参照ください。
コードからログする前に、次を実行する必要があります。
ハンドラーコードからログされたメッセージを収集するイベントテーブルを設定します。
詳細については、 イベントテーブルの設定 をご参照ください。
必要なメッセージがイベントテーブルに格納されるようにログレベルが設定されていることを確認してください。
詳細については、 ログレベルの設定 をご参照ください。
Javaの例¶
次の例のコードは、Snowflakeテレメトリライブラリへの参照をインポートし、そこからロガーを取得します。メッセージを INFO
レベルでログします。また、例外のエラーもログされます。
特定のレベルでのログに使用できるメソッドの詳細については、 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.");
}
}
$$
;
イベントテーブルで 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." |
--------------------------------------------------------