56279


お世話になります。  
Python3.7でプログラムを作成していますが、ログ機能を導入しようとしてつまずいています。  
とりあえず、例として、下記のようなプログラムを作成して、ログをファイルに出力しようとしているのですが、ログが出力されず、困っております。  
どこが問題なのか、よければ教えていただけないでしょうか。  
なお、ソースコードは2つに分かれていますが、両方ともログが出力されない状況です。  
よろしくお願いいたします。

## ソースコード

### test1.py

[code]

    import logging
    from logging import getLogger, FileHandler, Formatter
    from test2 import *
    
    def main():
        print("start")
        log = getLogger("test1")
        log.info("main initialized.")
        ret=test2()
        log.info("result=%d" % ret)
        log.info("finished.")
        print("result=%d" % ret)
        print("finished")
    
    def log_init():
        hLogHandler=FileHandler("testapp.log", mode="w", encoding="UTF-8")
        hLogHandler.setLevel(logging.DEBUG)
        hLogFormatter=Formatter("%(levelname)s - %(name)s (%(asctime)s.%(msecs)03d):\n%(message)s", "%H:%M:%S")
        hLogHandler.setFormatter(hLogFormatter)
        log = getLogger("logger")
        log.setLevel(logging.DEBUG)
        log.addHandler(hLogHandler)
    
    if __name__ == "__main__":
        log_init()
        main()
    
[/code]

### test2.py

[code]

    import logging
    from logging import getLogger, FileHandler, Formatter
    
    def test2():
        log = getLogger("test2")
        log.setLevel(logging.DEBUG)
        log.info("test2 initialized.")
        ret=1*2*3*4*5
        log.info("finished.")
        return ret
    
[/code]


CC BY-SA 4.0
2019-07-01T02:59:37.613
56276
2019-07-01T04:28:59.327
2019-07-01T04:28:59.327
3060
29034
question
python python3
Pythonのログ機能に関して


`getLogger` で取得したロガーがそれぞれ異なっているのが問題です。 一旦以下のようにすることで `test1` 内部のログを取得可能です。

また、 `test2` についても、モジュールとして構成する場合は通常 `__name__` として参照することで同様にログを出力することが可能です。

[code]

    import logging
    from logging import getLogger, FileHandler, Formatter
    
    def main():
        print("start")
        log = getLogger(__name__)
        log.info("main initialized.")
    
    def log_init():
        hLogHandler=FileHandler("testapp.log", mode="w", encoding="UTF-8")
        hLogHandler.setLevel(logging.DEBUG)
        hLogFormatter=Formatter("%(levelname)s - %(name)s (%(asctime)s.%(msecs)03d):\n%(message)s", "%H:%M:%S")
        hLogHandler.setFormatter(hLogFormatter)
        log = getLogger(__name__)
        log.setLevel(logging.DEBUG)
        log.addHandler(hLogHandler)
    
    if __name__ == "__main__":
        log_init()
        main()
    
    
[/code]


CC BY-SA 4.0
2019-07-01T03:43:12.543
56278
2019-07-01T03:43:12.543
29826
56276
answer


test1.pyに関しては`logger`の名前が異なっていることが原因ですね。

[code]

    log = getLogger("logger")
    
[/code]

を

[code]

    log = getLogger("test1")
    
[/code]

に変えてみてください。

test2.pyに関しては`Handler`が設定されていないことが原因です。  
試しに`test2()`の前に次の行を追加してみてください。

[code]

    getLogger("test2").addHandler(logging.StreamHandler())
    
[/code]

これらの変更を施して実行してみると次のような出力が得られます。

[code]

    start
    test2 initialized.
    finished.
    result=120
    finished
    
[/code]

`logging.basicConfig()`を呼ぶだけでも`Handler`をよしなに設定してくれますが、`test1`側も影響を受けます。また、`addHandler`を何度も呼ぶと、その回数だけログが重複して出力されますので、呼び出す個所にもご注意ください。


CC BY-SA 4.0
2019-07-01T04:18:13.657
56279
2019-07-01T04:18:13.657
13199
56276
answer