3

私たちが開発している Python アプリケーションには、ロガーが必要です。同僚は、ロガーを使用しているすべてのクラスでロガーを作成して構成する必要があると主張しています。私の意見では、アプリケーションの起動時に作成および構成し、コンストラクターパラメーターとして渡す必要があります。

どちらのバリアントにもメリットがあり、ベスト プラクティスが何であるかはわかりません。

4

3 に答える 3

0

多分これはあなたがアイデアを得るのに役立ちますか?もちろん、構成ファイルなどから設定を読み取って、より良くすることができますが、これは簡単な例です。

ロギングを構成する別のモジュール: mylogmod.py:

import logging

FILENAME = "mylog.log" # Your logfile
LOGFORMAT = "%(message)s" # Your format
DEFAULT_LEVEL = "info" # Your default level, usually set to warning or error for production
LEVELS = {
    'debug':logging.DEBUG,
    'info':logging.INFO,
    'warning':logging.WARNING,
    'error':logging.ERROR,
    'critical':logging.CRITICAL}

def startlogging(filename=FILENAME, level=DEFAULT_LEVEL):
    logging.basicConfig(filename=filename, level=LEVELS[level], format=LOGFORMAT)

main.py:_

import logging
from mylogmod import startlogging
from myclass import MyClass

startlogging()

logging.info("Program started...")
mc = MyClass()

myclass.pyセルフテスト付きのモジュールからのクラス。単体テストで同様のことを行うことができます: (単体テストでロギング モジュールをインポートする必要がないことに注意してくださいstartlogging。関数だけで十分です。この方法で、デフォルト レベルを警告またはエラーに設定し、単体テストと自己テストを実行できます。デバッグする)

import logging

class MyClass(object):
    def __init__(self):
        logging.info("Initialze MyClass instance...")

if __name__ == "__main__":
    from mylogmod import startlogging
    startlogging(level="debug")
    logging.debug("Test MyClass...")
    #... rest of test code...
于 2013-08-05T11:52:45.543 に答える
0

パラメータとしてロガーを渡すのは良い考えではないと思います。グローバルロガーを独自のモジュールと見なす必要があります。それが最善のアイデアです。例:
logger.py

import logging
log = logging.getLogger('')

classFoo.py

form logger import log
log.debug('debug message')

classBar.py

form logger import log
log.warn('warn!')
于 2013-08-05T07:49:52.663 に答える