Pythonでのメッセージのログ¶
Pythonの標準ライブラリのログモジュールである ログ を使用すると、Pythonで記述された関数またはプロシージャハンドラーからのメッセージをログできます。ログエントリを格納するイベントテーブルを設定すると、Snowflakeはハンドラーコードによって生成されたログエントリをテーブルに格納します。
Pythonでサポートされているログレベルの詳細については、 ログレベルのドキュメント をご参照ください。Snowflakeは、2つのPythonログレベルを特定の方法で処理することに注意してください。
Python
CRITICAL
レベルは FATAL として扱われます。Python
NOTSET
レベルは TRACE として扱われます。
Snowflakeでのログの設定とメッセージの取得に関する一般的な情報については、 関数とプロシージャからのメッセージのログ をご参照ください。
コードからログする前に、次を実行する必要があります。
ハンドラーコードからログされたメッセージを収集するイベントテーブルを設定します。
詳細については、 イベントテーブルの設定 をご参照ください。
必要なメッセージがイベントテーブルに格納されるようにログレベルが設定されていることを確認してください。
詳細については、 ログレベルの設定 をご参照ください。
Pythonを使用したログのしきい値レベルの上書き¶
Pythonのハンドラーコードを使って、 ログレベルに設定されたログしきい値レベルを SQL で上書きすることができます。Pythonでログレベルを設定すると、ログエントリは Pythonで定義されたログレベル を使用します。
Pythonでログレベルを設定することで、以下を実行できます。
Snowflakeセッション、またはプロシージャや UDF などのオブジェクトに設定されたしきい値を上書きする。
指定されたPythonパッケージにスコープされたしきい値を設定する。
たとえば、設定したロガー名(および イベントテーブル に格納されているもの)を使って、Pythonでそのロガーのしきい値を設定できます。
次の例のPythonコードは、Snowpark session
パッケージのログレベルを DEBUG に設定します。
session_logger = logging.getLogger('snowflake.snowpark.session')
session_logger.setLevel(logging.DEBUG)
ロガー名を使用したログレベルの設定¶
イベントテーブルに記録されたロガー名を使用して、そのロガーからのログエントリのしきい値を設定できます。これは、ロガーのしきい値を設定し、特定のレベル以上の不要なログエントリをフィルタリングする場合に便利です。
これを行うには、最初にイベントテーブルをクエリし、異なるログレベルをキャプチャしたいエントリに関連するロガー名を検出します。その後、そのロガー名を使って、ログレベルを希望するしきい値に設定します。
以下の例のコードは、返されるデータにロガー名を含めて、ログエントリをクエリします。名前は、 スコープ列 の値として取得できます。
SET event_table_name='my_db.public.my_event_table';
SELECT
TIMESTAMP as time,
RECORD['severity_text'] as log_level,
SCOPE['name'] as logger_name,
VALUE as message
FROM
IDENTIFIER($event_table_name)
WHERE
RECORD_TYPE = 'LOG';
このクエリは、複数のロガーに派生する多くのエントリを返す可能性があります。結果を見て、NumPyのロガーから不要な INFO
メッセージを多数取得していると判断した場合、Pythonを使って、 ERROR
レベル以上のログエントリをキャプチャするようにロガーのしきい値を設定することができます。
numpy_logger = logging.getLogger('numpy_logs')
numpy_logger.setLevel(logging.ERROR)
イベントテーブルのクエリの詳細については、 ログされたメッセージデータへのアクセス をご参照ください。
Pythonの例¶
次の例のコードは、 logging
モジュールをインポートし、ロガーを取得し、 INFO
レベルでメッセージをログします。
Pythonでサポートされているログレベルの詳細については、 ログレベルのドキュメント をご参照ください。
CREATE OR REPLACE PROCEDURE do_logging()
RETURNS VARCHAR
LANGUAGE PYTHON
PACKAGES=('snowflake-snowpark-python')
RUNTIME_VERSION=3.8
HANDLER='do_things'
AS $$
import logging
logger = logging.getLogger("python_logger")
logger.info("Logging from Python module.")
def do_things(session):
logger.info("Logging from Python function start.")
try:
throw_exception()
except Exception:
logger.error("Logging an error from Python handler: ")
return "ERROR"
return "SUCCESS"
def throw_exception():
raise 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'] = 'python_logger'
AND RECORD_TYPE = 'LOG';
前述の例では、次の出力が生成されます。
---------------------------------------------------------------------------
| SEVERITY | MESSAGE |
---------------------------------------------------------------------------
| "INFO" | "Logging from Python module." |
---------------------------------------------------------------------------
| "INFO" | "Logging from Python function start." |
---------------------------------------------------------------------------
| "ERROR" | "Logging an error from Python handler." |
---------------------------------------------------------------------------