◾️はじめに
Pythonの標準ログをまとめる
目次
【0】Pythonのログ機能 【1】サンプル 例1:簡易版 例2:標準出力 【2】コールスタック表示 1)stack_info=True 2)stacklevel=2
【0】Pythonのログ機能
* 標準でloggingが用意されている
https://docs.python.org/3/library/logging.html
https://docs.python.org/ja/3.14/library/logging.html
【1】サンプル
例1:簡易版
import logging import sys LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' logging.basicConfig( level=logging.INFO, stream=sys.stdout, format=LOG_FORMAT) logging.info("Start") logging.info("End")
出力結果
2020-05-08 20:31:38,665 - root - INFO - Start 2020-05-08 20:31:38,732 - root - INFO - End
例2:標準出力
import logging from logging import getLogger, StreamHandler, Formatter LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s' logger = None def initialize_logger(): global logger if logger is not None: return logger = getLogger("LoggerDemo") logger.setLevel(logging.DEBUG) stream_handler = StreamHandler() stream_handler.setLevel(logging.DEBUG) handler_format = Formatter(LOG_FORMAT) stream_handler.setFormatter(handler_format) logger.addHandler(stream_handler) initialize_logger() logger.debug("Hello World!") logger.info("Hello World!!") logger.warning("Hello World!!!") logger.error("Hello World!!!!") logger.critical("Hello World!!!!")
出力結果
2020-02-03 23:12:37,535 - LoggerDemo - DEBUG - Hello World! 2020-02-03 23:12:37,536 - LoggerDemo - INFO - Hello World!! 2020-02-03 23:12:37,536 - LoggerDemo - WARNING - Hello World!!! 2020-02-03 23:12:37,537 - LoggerDemo - ERROR - Hello World!!!! 2020-02-03 23:12:37,538 - LoggerDemo - CRITICAL - Hello World!!!!
【2】コールスタック表示
1)stack_info=True
* コールスタックを表示
サンプル
import logging logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) def dummy_function(): logger.info("Demo stack info", stack_info=True) dummy_function()
出力例
INFO:__main__:Demo stack info
Stack (most recent call last):
File "/Users/user/work/git/demo-hello-template/{{ cookiecutter.project_slug }}/main.py", line 8, in <module>
dummy_function()
File "/Users/user/work/git/demo-hello-template/{{ cookiecutter.project_slug }}/main.py", line 6, in dummy_function
logger.info("Demo stack info", stack_info=True)
2)stacklevel=2
* loggingモジュールでラッパー関数やクラスを使用した際、 ログの出力元をラッパー内ではなく「真の呼び出し元」に 正しく設定するために使用 => 例えば、logging を使って独自ログクラスを作成する際に stacklevel=2(デフォルトは1)を指定することで、 呼び出しスタックを1つ遡った位置がログに記録
サンプル
import logging # ロガーの設定 logging.basicConfig(format='%(levelname)s:%(message)s (%(filename)s:%(lineno)d)') logger = logging.getLogger(__name__) def wrapped_log(msg): # stacklevel=1 (デフォルト) だとこの行が記録される # stacklevel=2 にすると、この関数を呼んだ側が記録される logger.warning(f"Wrapped: {msg}", stacklevel=2) def main(): logger.warning("直接のログ") # (main.py:13) wrapped_log("ラッパー経由のログ") # (main.py:14) if __name__ == "__main__": main()
参考文献
https://qiita.com/mimitaro/items/9fa7e054d60290d13bfc
関連記事
Python ~ 基本編 / global・nonlocal ~
https://dk521123.hatenablog.com/entry/2019/12/12/232749
Python ~ glob ~
https://dk521123.hatenablog.com/entry/2026/03/11/000219