Java에서 메시지 로깅하기

SLF4J API 를 사용하여 Java로 작성된 함수 또는 프로시저 처리기의 메시지를 로깅할 수 있습니다. 로그 항목을 저장하도록 이벤트 테이블을 설정하면 Snowflake가 처리기 코드에서 생성된 로그 항목을 테이블에 저장합니다.

Snowflake에 포함된 Snowflake 원격 분석 라이브러리에 함께 제공되는 SLF4J API 를 사용할 수 있습니다. 그렇게 하려면 함수나 프로시저를 만들 때 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 메서드 를 참조하십시오.

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.");
    }
  }
$$
;
Copy

이벤트 테이블에서 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';
Copy

앞의 예제에서는 다음 출력을 생성합니다.

--------------------------------------------------------
| SEVERITY | MESSAGE                                   |
--------------------------------------------------------
| "INFO"   | "Logging from within the constructor."    |
--------------------------------------------------------
| "INFO"   | "Logging from method start."              |
--------------------------------------------------------
| "ERROR"  | "Logging an error: Something went wrong." |
--------------------------------------------------------