2011-09-16 9 views
4

ここではPythonロギングクラスのチュートリアルを見ましたが、同じ出力に対してさまざまなレベルの複数のログを作成することはできませんでした。最後に、私は3つのログを持っているしたいと思います: <timestamp>_DEBUG.log(デバッグレベル)
<timestamp>_INFO.log(情報レベル)
<timestamp>_ERROR.log(エラーレベル)Python loggerクラスを使用して異なるログレベルの複数のログを生成

、ひとつのスクリプトでは、のために複数のログファイルを生成する方法はあります同じ入力ですか?

< -------------更新番号1 -------------------------->
したがって、@ robertの提案を実装する際には、コードに何が行われているのかを十分に理解していないため、小さな問題があります。私の問題への今

import sys 

def script2Test2(): 
    print y 
def script2Ttest3(): 
    mundo="hungry" 

global x 
x = [] 

theTests = (test2, test3) 

for test in theTests: 
    try: 
     test() 
     x.append([1,test.__name__," OK"]) 
    except: 
     error = str(sys.exc_info()[1]) 
     x.append([2,test.__name__,error]) 

:ここ

はscriptRun.py

import os 
import logging 

logger = logging.getLogger("exceptionsLogger") 
debugLogFileHandler = logging.FileHandler("Debug.log") 
errorLogFileHandler = logging.FileHandler("Error.Log") 
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
errorLogFileHandler.setFormatter(formatter) 
debugLogFileHandler.setFormatter(formatter) 
logger.addHandler(debugLogFileHandler) 
logger.addHandler(errorLogFileHandler) 

class LevelFilter(logging.Filter): 
    def __init__(self, level): 
     self.level = level 
    def filter(self, record): 
     return record.levelno == self.level 
debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG)) 
errorLogFileHandler.addFilter(LevelFilter(logging.ERROR)) 

directory = [] 
for dirpath, dirnames, filenames in os.walk("path\to\scripts"): 
    for filename in [f for f in filenames if f.endswith(".py")]: 
     directory.append(os.path.join(dirpath, filename)) 
for entry in directory: 
    execfile(entry) 
    for lists in x: 
     if lists[0] == 2: 
      logger.error(lists[1]+" "+lists[2]) 
     elif lists[0] == 1: 
      logger.debug(lists[1]+" "+lists[2]) 

が何であるかを、この実行しているの例では私のコードで私が実行したときにscriptRun.pyを実行すると、エラーをスローしません。それとerror.logdebug.logが作成されますが、error.logにはエントリが設定されています。

なぜですか?

< ------------------------更新#2 ------------------ ----->

私は警告よりも「低い」ものは何も記録されていないことに気づきました。たとえ私がフィルターを取り除いてもdebugLogFileHandler.setLevel(logging.DEBUG)それは問題ではないようです。実際のログコマンドをlogger.warning以上に設定すると、ログに出力されます。もちろん、私はdebugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))のコメントを外すと、Debug.logにログのアクティビティはありません。私は自分のログレベルを作成したいと思っていましたが、誰か他の人がこのコードを使用している場合は、本当に悪い考えです。

< -------------------------最終更新------------------ --->
まあ私はばかげて、DEBUGレベルのイベントを記録するようにロガー自体を設定するのを忘れてしまった。デフォルトでは、ロギングクラスは警告の下に何も記録しないので、送信するデバッグ情報は記録されませんでした。

最終的な感謝と、フィルタの@Robertへの尽力。

答えて

9

1つの出力ファイル(INFO.log、DEBUG.logなど)ごとに複数のハンドラを作成します。

特定のレベルのみを許可するフィルタを各ハンドラに追加します。例えば

import logging 

# Set up loggers and handlers. 
# ... 

class LevelFilter(logging.Filter): 
    def __init__(self, level): 
     self.level = level 

    def filter(self, record): 
     return record.levelno == self.level 

debugLogFileHandler.addFilter(LevelFilter(logging.DEBUG)) 
infoLogFileHandler.addFilter(LevelFilter(logging.INFO)) 
+0

ちょうどので、私はそれをよりよく理解する:ちょうど1ロガーを使用し、各ファイルハンドラが見ているログメッセージをフィルタリングするために、このクラスを使用します(さまざまなレベルのために複数のファイルを作成し、複数のロガーを使用してはいけません) ? – Snaxib

+0

はい、それです。ロガーはアプリケーションのエリアを表し、ハンドラーはイベントのロギングの宛先を表し、いずれかまたは両方にフィルターを適用して、すべての宛先または特定の宛先のイベントを選択的にドロップすることができます。 –

+0

はい。もちろん、複数のロガーを作成することもできますが、debugLog.debug( "foo")などを書くのはかなり面倒です。 – robert

関連する問題