Scala에서 메시지 로깅하기¶
SLF4J API 를 사용하여 Scala로 작성된 함수 또는 프로시저 처리기의 메시지를 로깅할 수 있습니다. 로그 항목을 저장하도록 이벤트 테이블을 설정하면 Snowflake가 처리기 코드에서 생성된 로그 항목을 테이블에 저장합니다.
Snowflake에 포함된 Snowflake 원격 분석 라이브러리에 함께 제공되는 SLF4J API 를 사용할 수 있습니다. 그렇게 하려면 함수나 프로시저를 만들 때 PACKAGES 절에 com.snowflake:telemetry:latest
값을 포함하십시오.
Maven으로 코드를 패키징할 때 Telemetry 라이브러리를 포함하는 방법에 대한 자세한 내용은 원격 분석 클래스를 사용하도록 Java 및 Scala 환경 설정하기 섹션을 참조하십시오.
참고
Snowflake 원격 분석 라이브러리를 사용하면 함수 또는 프로시저의 실행 환경에 다른 라이브러리가 추가됩니다. 자세한 내용은 Snowflake 원격 분석 패키지 종속성 섹션을 참조하십시오.
참고
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_scala()
RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = '2.12'
PACKAGES=('com.snowflake:telemetry:latest', 'com.snowflake:snowpark:latest')
HANDLER = 'ScalaLoggingHandler.doThings'
AS
$$
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import com.snowflake.snowpark.Session
class ScalaLoggingHandler {
private val logger: Logger = LoggerFactory.getLogger(getClass)
def doThings(session: Session): String = {
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" |
| | } |
------------------------------------------------------------------
Scala의 예¶
다음 예제 가져오기의 코드는 Snowflake 원격 분석 라이브러리를 참조하고 이 라이브러리에서 로거를 가져옵니다. INFO
수준에서 메시지를 로깅합니다. 또한 예외에 대한 오류를 로깅합니다.
특정 수준에서 로깅하는 데 사용할 수 있는 메서드에 대한 자세한 내용은 SLF4J 메서드 를 참조하십시오.
CREATE OR REPLACE PROCEDURE do_logging()
RETURNS VARCHAR
LANGUAGE SCALA
RUNTIME_VERSION = '2.12'
PACKAGES=('com.snowflake:snowpark:latest', 'com.snowflake:telemetry:latest')
HANDLER = 'ScalaLoggingHandler.doThings'
AS
$$
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import com.snowflake.snowpark.Session
class ScalaLoggingHandler {
private val logger: Logger = LoggerFactory.getLogger(getClass)
logger.info("Logging from within the Scala constructor.")
def doThings(session: Session): String = {
logger.info("Logging from Scala method start.")
try {
throwException
} catch {
case e: Exception => logger.error("Logging an error from Scala handler: " + e.getMessage())
return "ERROR"
}
return "SUCCESS"
}
// Simulate a thrown exception to catch.
@throws(classOf[Exception])
private def throwException = {
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'] = 'ScalaLoggingHandler'
AND RECORD_TYPE = 'LOG';
앞의 예제에서는 다음 출력을 생성합니다.
---------------------------------------------------------------------------
| SEVERITY | MESSAGE |
---------------------------------------------------------------------------
| "INFO" | "Logging from within the Scala constructor." |
---------------------------------------------------------------------------
| "INFO" | "Logging from Scala method start." |
---------------------------------------------------------------------------
| "ERROR" | "Logging an error from Scala handler: Something went wrong." |
---------------------------------------------------------------------------