Java에서 메시지 로깅하기
SLF4J API 를 사용하여 Java로 작성된 함수 또는 프로시저 처리기의 메시지를 로깅할 수 있습니다. 로그 항목을 저장하도록 이벤트 테이블을 설정하면 Snowflake가 처리기 코드에서 생성된 로그 항목을 테이블에 저장합니다.
Snowflake에 포함된 Snowflake 원격 분석 라이브러리에 함께 제공되는 SLF4J API 를 사용할 수 있습니다. 그렇게 하려면 함수나 프로시저를 만들 때 PACKAGES 절에 com.snowflake:telemetry:latest 값을 포함하십시오.
Maven으로 코드를 패키징할 때 Telemetry 라이브러리를 포함하는 방법에 대한 자세한 내용은 원격 분석 클래스를 사용하도록 Java 및 Scala 환경 설정하기 섹션을 참조하십시오.
참고
SLF4J는 FATAL 수준에서 메시지 로깅을 지원하지 않습니다. Java 또는 Scala로 작성된 처리기의 경우 FATAL 수준은 ERROR 수준으로 처리됩니다.
예를 들어 LOG_LEVEL 매개 변수를 FATAL 로 설정하면 Java 또는 Scala 처리기의 ERROR 수준 메시지가 수집됩니다.
Snowflake에서 로깅 설정 및 메시지 검색에 대한 일반적인 정보는 함수 및 프로시저의 메시지 로깅하기 섹션을 참조하십시오.
코드에서 로깅하기 전에 다음을 수행해야 합니다.
사용자 지정 특성 추가하기
로그 항목을 생성할 때 키-값 페어로 사용자 고유의 특성을 추가할 수 있습니다. Snowflake는 이러한 사용자 지정 특성을 이벤트 테이블의 RECORD_ATTRIBUTES 열 에 저장합니다.
사용자 지정 특성을 추가하려면 Logger.atInfo 및 Logger.atError 같은 slf4j fluent API의 메서드를 호출합니다. 이러한 방법을 사용하여 로그 항목에 키-값 페어를 설정합니다. 각각은 로그 메시지를 설정하는 데 사용할 수 있는 org.slf4j.spi.LoggingEventBuilder 를 반환합니다.
다음 예제의 코드는 이벤트 테이블의 VALUE 열에 “특성 포함 기록” 메시지를 기록합니다. 또한 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";
}
}
$$;
이 Logger.atInfo 호출의 출력은 이벤트 테이블에 다음과 같이 표시됩니다. RECORD_ATTRIBUTES 열에는 Snowflake가 자동으로 추가하는 특성이 포함됩니다.
------------------------------------------------------------------
| VALUE | RECORD_ATTRIBUTES |
------------------------------------------------------------------
| "Logging with attributes" | { |
| | "custom1": "value1", |
| | "thread.name": "Thread-5" |
| | } |
------------------------------------------------------------------
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." |
--------------------------------------------------------