2013-05-18 17 views
5

私はPythonロガーの質問でサイトを見て、私がそこで解決されることを期待しました。私は、異なるフォーマットとロギングのレベルの両方を持つ2つのストリーム・ハンドラとロガーを設定して、ここに私のコードベースから機能の抜粋です:PythonロガーはsetLevelを尊重していませんか?

import os 
import time 
import logging 

LOG_LEVELS = [logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG] 
TEST_RESULT_LEVELV_NUM = 51 

# http://stackoverflow.com/a/11784984/196832 
def status(self, message, *args, **kws): 
    self._log(TEST_RESULT_LEVELV_NUM, message, args, **kws) 

logging.addLevelName(TEST_RESULT_LEVELV_NUM, "RESULT") 
logging.Logger.result = status 


def setup_logging(level=0, quiet=False, logdir=None): 
    logger = logging.getLogger('juju-test') 
    ffmt = logging.Formatter('%(asctime)s %(name)s %(levelname)-8s: %(message)s') 
    cfmt = logging.Formatter('%(name)s %(levelname)s: %(message)s') 
    #logger.setLevel(0) 

    if level >= len(LOG_LEVELS): 
     level = len(LOG_LEVELS) - 1 

    if logdir: 
     if not os.path.exists(logdir): 
      os.makedirs(logdir) 
     logfile = os.path.join(logdir, 'juju-test.%s.log' % int(time.time())) 
     fh = logging.FileHandler(logfile) 
     # Always at least log to INFO for file, unless DEBUG is requested 
     fh.setLevel(LOG_LEVELS[level if level >= 2 else 2]) 
     fh.setFormatter(ffmt) 
     logger.addHandler(fh) 

    if not quiet: 
     ch = logging.StreamHandler() 
     ch.setLevel(LOG_LEVELS[level]) 
     ch.setFormatter(cfmt) 
     logger.addHandler(ch) 

    return logger 

が、私はこれを養うためにargparseを使用してきたが、テストのために目的は、あなたは、関数に以下のフィード場合:

logger = setup_logging(level=1, logdir="/tmp/oofrab/") 
logger.info('Informative!') 
logger.warn('Whoa buddy!') 
logger.error('Look what you did.') 
logger.result("They told me not to make a custom logging level, I'll show them!") 
logger.debug('Lots of bugs, man') 

私が見ることを期待したいstatuserror、およびコンソールでwarn。次に、status,error,warnおよびinfoをログに記録します。しかし、ファイルハンドラのlogging.INFOLOG_LEVELSリストのキー2)を選択したにもかかわらず、コンソールとログファイルの両方でwarnまでしか表示されません。これは期待されていますか?

ロガーをビルドするときにbasicConfigなどを使用していないため、これらの2つのカスタムレベルを使用できないのはなぜですか?

答えて

2

明らかに、logging.NOTSETは「すべてのレベル」を意味するのではなく、むしろデフォルトです。親ロガーをレベル0に設定すると、デフォルトの受け入れレベルに戻されます。つまり、logger.setLevelをlogging.DEBUGに設定すると、基本的にすべてのレベルを受け入れるようにログを設定すると、さまざまなハンドラにフィルタリングを渡してさらにフィルタをかけます。これはhttps://docs.python.org/2/library/loggingでより詳細に説明される1

+0

にこの(および潜在的なカスタムログレベル)を回避するために

私は最初のロガーレベルを設定しました.html#logging.Logger.setLevel – user545424

関連する問題