74908

[code]

    logger = logging.getLogger('default')
    formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s")
    handler = logging.StreamHandler()
    handler.setLevel(logging.INFO)
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    
[/code]

現在こういうログを仕込んでいるんですが  
デバッグログを別に仕込みたいです

[code]

    handler2 = logging.FileHandler(filename="logs/debug.log")
    handler2.setLevel(logging.DEBUG)
    handler2.setFormatter(logging.Formatter("%(asctime)s %(levelname)8s %(message)s"))
    logger.addHandler(handler2)
    
[/code]

例えばこういうのを追加した場合 DEBUG 以上のログが出力されて元のログと重複してみにくいしディスクも無駄なので  
debug レベルのみ出力を分離したいんですが方法はありませんか？

別に logger を使わずに単に別ファイルに追記するようなコードを書けばいいだけなんですが  
せっかく logger があるので logger を使ってできないか質問した次第です


CC BY-SA 4.0
2021-03-26T06:46:04.830
74898
2021-03-26T14:01:29.160
question
python
logger で特定のログレベルだけ分離して別ファイルにはきたい


Python loggingの資料には, 各種の機能の説明やサンプルが載ってます

  * [Logging HOWTO](https://docs.python.org/ja/3/howto/logging.html)
  * [Logging クックブック](https://docs.python.org/ja/3/howto/logging-cookbook.html)

その中の `Filter`を使用して, `LogRecord` を調べ, 場合によっては弾くことができます  
(他にも各種の事例が載ってるので一度目を通しておくとよいでしょう)

[code]

    class LevelFilter(logging.Filter):
        def filter(self, record):
            return record.levelname == 'DEBUG'
    
    logger.setLevel(logging.DEBUG)
    fh.setLevel(logging.DEBUG)
    fh.addFilter(LevelFilter())
    logger.addHandler(fh)
    
[/code]


CC BY-SA 4.0
2021-03-26T10:09:22.393
74908
2021-03-26T10:09:22.393
43025
74898
answer


DEBUGレベルだけをdebug.logにロギングするコード例です。

[code]

    import logging
    
    logger = logging.getLogger('default')
    formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s")
    
    
    class LevelFilterDEBUG(logging.Filter):
        def filter(self, record):
            return record.levelname == 'DEBUG'
    
    handler_debug_only = logging.FileHandler('logs/debug.log')
    handler_debug_only.setLevel(logging.DEBUG)
    handler_debug_only.setFormatter(formatter)
    handler_debug_only.addFilter(LevelFilterDEBUG())
    
    logger.setLevel(logging.DEBUG)
    logger.addHandler(handler_debug_only)
    
    handler = logging.StreamHandler()
    handler.setLevel(logging.INFO)
    handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)8s %(message)s"))
    logger.addHandler(handler)
    
    # 'application' code
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warn message')
    logger.error('error message')
    logger.critical('critical message')
    
[/code]

* * *

oririさんの回答と紹介のあった次のサイトを参考にしました。

  * [Logging HOWTO](https://docs.python.org/ja/3/howto/logging.html)
  * [Logging クックブック](https://docs.python.org/ja/3/howto/logging-cookbook.html)


CC BY-SA 4.0
2021-03-26T14:01:29.160
74917
2021-03-26T14:01:29.160
35558
74898
answer