1

Flask Web アプリケーションがあり、アプリケーションの起動時にdictConfigを介して Python ログの構成が行われます。特定のログをデータベースに書き込むためのハンドラーが、ロガー「test.module」にアタッチされています。そのロガーに作成されたログはlogging.basicConfig(level=logging.DEBUG)、アプリケーションの起動時にも呼び出された場合にのみ、データベースに書き込まれます。それ以外の場合、ログはデータベースに書き込まれません。basicConfig が streamHandler をルートロガーにアタッチするだけであることは知っています。ルートロガーによって何も行われたくないので、これは無関係であるべきだと思います。これが basicConfig なしでは機能しないのはなぜですか?

ロガーを開始する方法と構成を以下に追加しました。

class DbHandler(logging.Handler):
    def __init__(self, level=logging.NOTSET):
        logging.Handler.__init__(self, level)

    def emit(self, record):
        record.message = self.format(record)
        log = DbModel()
        log.message = record.message
        log.save()


LOGGING = {
    'version': 1,
    'handlers': {
        'db_log': {
            'level': 'DEBUG',
            'class': 'test.handlers.DbHandler',
        },
    },
    'loggers': {
        'test.important_module': {
            'handlers': [
                'db_log'
            ],
    },
}

# logging.basicConfig(level=logging.DEBUG) # Doesnt work without this
logging.config.dictConfig(LOGGING)

logger = logging.getLogger('test.important_module')
logger.info('Making a test')
4

1 に答える 1

6

'test.important_module'ロガー自体のレベルを設定していません(ハンドラーのレベルのみを設定します)。

あなたはこのようにそれを行うことができます:

logger = logging.getLogger('test.important_module')
logger.setLevel(logging.DEBUG)

またはこのように:

'loggers': {
    'test.important_module': {
        'level': 'DEBUG',         # <<< HERE
        'handlers': [
            'db_log'
        ],
},
于 2013-02-19T14:02:33.850 に答える