9

コードベース全体にログ ステートメントが分散している場合、コードを運用環境にデプロイするときにロガーへの各呼び出しをコメントアウトする必要がないように、ロガーを設定するにはどうすればよいですか?

これが私の現在のコードです:

import logging


logging.basicConfig(filename='./example.log', level=logging.DEBUG, 
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M')

logging.debug('debug failed')
logging.info('info failed')
logging.warning('A warning')
4

3 に答える 3

4

を使用する代わりに、basicConfig任意の基準に基づいて、必要なハンドラーを使用してロガーをより明示的に設定できます。

import logging

log = logging.getLogger("FOO")
log.setLevel(logging.DEBUG)

# needs a handler
log.info('info')
#No handlers could be found for logger "FOO"

ch = logging.StreamHandler()
log.addHandler(ch)
log.info('info')
# info

log.removeHandler(ch)

noop = logging.NullHandler()
log.addHandler(noop)
# nothing happens here
log.info('info')

デバッグ モードで実行している場合に必要なハンドラーを追加する条件ステートメントを作成するかNullHandler、ログ メッセージを吸収するだけの を追加することができます。各ハンドラーのレベルを個別に構成して、常に警告以上を表示することもできます。メインロガーに加えて、各ハンドラーは独自のレベルを持つことができます。

レベル、ハンドラー、および書式設定をより具体的にする方法については、チュートリアルを参照できます。

于 2012-09-18T19:07:11.487 に答える
2

ここには、本当に簡単な答えがいくつかあります。basicConfig(...)1 つ目は、単にステートメントをコメント アウトすることです。これは、ロガー、ハンドラー、またはフォーマッターのいずれも設定しないという効果があります。これは、debug()、info() などの呼び出しが事実上 no-op になることを意味します。

もう 1 つの簡単な答えは、basicConfig()呼び出しのログ レベルを より高い値に設定することですDEBUGCRITICAL + 1ログメッセージが表示されないようにします。

ただし、このコードを本番環境に移行することについて何か言及したので、おそらくやりたいことは-q-vコマンドラインオプションを提供することです (これが CLI ツールであると仮定します)。私の通常のアプローチは、レベルから始めWARNING-q、フィルタ レベルを上げることで、より静かなロギングに向けて移動することです。逆に、それぞれについて-v、より詳細なロギングに移行します。まさにそれを行うコードのスニペットを次に示します。

from argparse import ArgumentParser
from logging import basicConfig, CRITICAL, ERROR, WARNING, INFO, DEBUG

parser = ArgumentParser()
parser.add_argument("-v", "--verbose", action="count")
parser.add_argument("-q", "--quiet", action="count")

arguments = parser.parse_args()

raw_log_level = 2 + (arguments.verbose or 0) - (arguments.quiet or 0)
if raw_log_level <= 0: 
    log_level = CRITICAL
elif raw_log_level == 1:
    log_level = ERROR
elif raw_log_level == 2:     # default
    log_level = WARNING
elif raw_log_level == 3: 
    log_level = INFO
else:         
    log_level = DEBUG

basicConfig(level=log_level)
于 2013-12-04T01:16:36.027 に答える
1

ロギングにはいくつかのレベルがあります。ロギングレベルの重大度に基づいて、それを印刷します。

Level   Numeric value
CRITICAL    50
ERROR   40
WARNING     30
INFO    20
DEBUG   10
NOTSET  0

ロギングレベルに基づいて、ステートメントを出力します。

ここで指定したレベルはlevel=logging.DEBUGです。したがって、設定されていないログレベルを除くすべてが出力されます。重要なレベルのみを印刷する場合は、level=logging.CRITICALを変更してください。

http://docs.python.org/release/2.5/lib/module-logging.htmlに詳細情報があります

于 2012-09-18T19:05:16.963 に答える