2016-07-20 8 views
3

私はSLF4JとLog4Jから来ているので、私はPythonでどのようにロギングが動作するのかわかりません。Pythonでのロガー設定のロギングと継承

私はmod.py

import logging 

def foo(): 
    log = logging.getLogger (__name__) 
    log.debug ('Hello from the module') 

-----

---- logging.yaml

version: 1 

handlers: 

    console: 
    class: logging.StreamHandler 
    level: DEBUG 
    stream: ext://sys.stderr 
    formatter: simpleFormatter 

    file: 
    class: logging.FileHandler 
    filename: app.log 
    mode: w 
    level: DEBUG 
    formatter: simpleFormatter 

formatters: 
    simpleFormatter: 
    #class: !!python/name:logging.Formatter 
    #class: logging.Formatter 
    format: '%(name)s %(asctime)s %(levelname)s %(message)s' 
    datefmt: '%d/%m/%Y %H:%M:%S' 


root: 
    level: INFO 
    handlers: [console, file] 

mod: 
    level: DEBUG 

を以下している---- main.py

from logging.config import dictConfig 
import yaml 
with open ('logging.yaml') as flog: 
    dictConfig (yaml.load (flog)) 

import logging 

from mod import foo 

if __name__ == '__main__': 

    log = logging.getLogger (__name__) 
    log.debug ('Hello from main') 

    foo() 

上記の設定では、メッセージ'Hello from the module'。代わりに、何も印刷されません。ルートロガーにDEBUGを設定すると、両方のメッセージが出力されます。

したがって、上部ロガーに転送されるメッセージはありませんか? modロガーがrootの子ではありませんか? modロガーはhandlersの設定を継承していませんか? (私はをmodに繰り返そうとしましたが、何も変わりません)。

デフォルトのレベルはINFO、このモジュールとサブモジュールのレベルはDEBUG、すべてがrootのハンドラに移動しますか?

+1

私はちょうどこれをここに入れます:https://www.python.org/dev/peps/pep-0008/ – jonrsharpe

答えて

2

あなたはかなり単純なエラーがありますし、このキーを追加し、適切な行をインデント

a dict in which each key is a logger name and each value is a dict describing how to configure the corresponding Logger instance

:としてthe docsごとに、root以外のロガーのための構成がloggersキーの下にあるべき、ということに注意してください与える:予想通り

loggers: 
    mod: 
    level: DEBUG 

作品:

$ python main.py 
mod 20/07/2016 14:35:32 DEBUG Hello from the module 

$ cat app.log 
mod 20/07/2016 14:35:32 DEBUG Hello from the module 
+0

私はそれが何かばかげたことを知っていました!ありがとうジョン、追加する1つのことは、ルートがロガーの下に行かないことです。 – zakmck

+1

@zakmckはい:もう一度、* "ルート以外" *。 – jonrsharpe

関連する問題