Python loggingメモ

2024/10/21に公開
[loggers]
keys=root,module1,module2

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=standardFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler

[logger_module1]
level=INFO
handlers=consoleHandler
qualname=module1
propagate=0

[logger_module2]
level=ERROR
handlers=fileHandler
qualname=module2
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=standardFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
level=INFO
formatter=standardFormatter
args=('app.log', 'a')

[formatter_standardFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s
datefmt=%Y-%m-%d %H:%M:%S
import logging
import logging.config
import sys
from module1 import function1
from module2 import function2

def setup_logging(default_path='logging.conf', default_level=logging.DEBUG, env_key='LOG_CFG'):
    """
    外部ファイルからログ設定を読み込む関数。
    環境変数LOG_CFGが設定されていればそのパスを使用し、なければdefault_pathを使用。
    """
    import os
    path = default_path
    value = os.getenv(env_key, None)
    if value:
        path = value
    if os.path.exists(path):
        logging.config.fileConfig(path)
    else:
        logging.basicConfig(level=default_level)
        print(f"Logging configuration file not found: {path}. Using basicConfig.", file=sys.stderr)

def main():
    # ログ設定を初期化
    setup_logging()
    logger = logging.getLogger(__name__)
    logger.info("アプリケーションが開始されました。")

    # 他のモジュールの関数を呼び出す
    function1()
    function2()

    logger.info("アプリケーションが終了しました。")

if __name__ == '__main__':
    main()

Discussion