petitviolet blog

    Flaskでloggingの設定を外部ファイルから読み込む

    2014-09-23

    QiitaPythonFlask

    Flask で普通に logging をする場合、Flask logging exampleのように、

    app.py
    app = Flask(__name__)
    app.logger.debug("test message")
    

    のようにすれば簡単に出来る。 しかし、loggingの外部ファイルから設定を読み込むfileConfig

    fileconfig
    import logging.config
    logging.config.fileConfig("config.ini")
    

    dictConfigが使えない

    dictconfig
    import logging.config
    import yaml
    logging.config.dictConfig(yaml.load(open("config.yaml").read()))
    

    やると当然AttributeErrorとなる。

    app.logger.fileConfig('./config.ini')
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-29-70995f52c865> in <module>()
    ----> 1 app.logger.fileConfig('./config.ini')
    
    AttributeError: 'DebugLogger' object has no attribute 'fileConfig'
    

    そのため、app.logger.addHandlerでコードでいちいち書かないとだめっぽく感じる。

    しかし、app.loggerloggingをラップしただけなので、app.run()する前にlogging.config.fileConfig()を呼べば設定は反映される。

    設定ファイル

    基本的にはやはりドキュメントを参照する yaml の書き方は、handlersに使用するclass(この場合はlogging.StreamHandlerlogging.TimedRotatingFileHandler)のコンストラクタのキーワード引数に対応させれば良い。

    個人用テンプレ

    ini より yaml の方が好きなので yaml を使う

    config.yaml
    version: 1
    
    formatters:
      customFormatter:
        format: "[%(asctime)s]%(levelname)s - %(filename)s#%(funcName)s:%(lineno)d: %(message)s"
        datefmt: "%Y/%m/%d %H:%M:%S"
    
    loggers:
      file:
        handlers: [fileRotatingHandler]
        level: DEBUG
        qualname: file
        propagate: no
    
      console:
        handlers: [consoleHandler]
        level: DEBUG
        qualname: console
        propagate: no
    
    handlers:
      fileRotatingHandler:
        formatter: customFormatter
        class: logging.handlers.TimedRotatingFileHandler
        level: DEBUG
        filename: log/debug.log
        encoding: utf8
        when: "D"
        interval: 1
        backupCount: 14
    
      consoleHandler:
        class: logging.StreamHandler
        level: DEBUG
        formatter: customFormatter
        stream: ext://sys.stdout
    
    root:
      level: DEBUG
      handlers: [fileRotatingHandler, consoleHandler]
    

    最後のrootを忘れるとうまく動かない これに気付かずはまってしまった

    from: https://qiita.com/petitviolet/items/86a3cc74d35fd9f6c96c