57223


用途別（通信、ユーザー操作、その他など）にログファイルを分けて出力したいのですが、  
以下のコードでは、2つのログファイルに同じ出力となります。  
※本来のコードから切り貼りしており、一部なんでこんな書き方？となっているとは思いますが、ご容赦ください。

意図するところでは、  
alog.debug("なんでこうなるのか？")->app.logのみに出力したい。  
ulog.debug("わかりません。")->user.logのみに出力したい。

ご存知の方がいらっしゃれば、ご教示をお願いします。

[code]

    #! /usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import logging
    import logging.handlers
    
    class _writeLog():
        def __init__(self, logger):
            self.logger = logger
    
        def debug(self,log_text,*args,**kwargs):
            ret = self.logger.debug(log_text,*args,**kwargs)
            return ret
    
        def info(self,log_text,*args,**kwargs):
            ret = self.logger.info(log_text,*args,**kwargs)
            return ret
    
        def warning(self,log_text,*args,**kwargs):
            ret = self.logger.warning(log_text,*args,**kwargs)
            return ret
    
        def error(self,log_text,*args,**kwargs):
            ret = self.logger.error(log_text,*args,**kwargs)
            return ret
    
        def critical(self,log_text,*args,**kwargs):
            ret = self.logger.critical(log_text,*args,**kwargs)
            return ret
    
        def notset(self,log_text,*args,**kwargs):
            ret = self.logger.debug(log_text,*args,**kwargs)
            return ret
    
    def write_log():
        _Log = dict()
    
        LOGS_FORMAT = (
            "%(asctime)s "
            "%(name)s "
            "%(process)06d "
            "%(thread)06d "
            "%(levelname)8s "
            "%(message)s"
            )
    
        path = [
            'app',
            'user'
            ]
        for i in range(2):
            hLog = logging.handlers.RotatingFileHandler(path[i]+'.log',backupCount=2,maxBytes=1*1024*1024)
            hLog.setFormatter(logging.Formatter(LOGS_FORMAT))
            hLog.setLevel('DEBUG')
            _Log.setdefault(path[i],hLog)
    
        app_handler = _Log['app']
        user_handler = _Log['user']
    
        log_header = __name__
    
        app_logger = logging.getLogger(log_header)
        user_logger = logging.getLogger(log_header)
    
        app_logger.setLevel('DEBUG')
        app_logger.addHandler(app_handler)
    
        alog = _writeLog(app_logger)
    
        user_logger.setLevel('DEBUG')
        user_logger.addHandler(user_handler)
    
        ulog = _writeLog(user_logger)
    
        alog.debug("なんでこうなるのか？")
        ulog.debug("わかりません。")
    
    if __name__ == '__main__':
        write_log()
    
[/code]


CC BY-SA 4.0
2019-08-07T07:13:47.053
57215
2019-08-07T13:13:07.620
2019-08-07T10:35:09.267
19110
32891
question
python python3 logging
Python 用途に応じてログファイルを分けて出力したい。


`logging.getLogger` によって取得されるロガーオブジェクトは、同一 name に対しては、同じインスタンスが返されるからです。なので、
addHander は同じ、 `__main__` の名前を持った logger に対して実行されています。 (スクリプトとして実行したならば)

[code]

    print(repl(user_logger is app_logger))
    # => True
    
[/code]

例えばこうすると、やりたいことがひとまずはできると思います。

[code]

    app_logger = logging.getLogger(f"{__name__}.app")
    user_logger = logging.getLogger(f"{__name__}.user")
    
    # -> 別々の logger になるので、それぞれ別々の handler を追加してもまざらない。
    
[/code]


CC BY-SA 4.0
2019-08-07T13:13:07.620
57223
2019-08-07T13:13:07.620
754
57215
answer