ここでは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.pyimport 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.log
とdebug.log
が作成されますが、error.log
にはエントリが設定されています。
なぜですか?
< ------------------------更新#2 ------------------ ----->
私は警告よりも「低い」ものは何も記録されていないことに気づきました。たとえ私がフィルターを取り除いてもdebugLogFileHandler.setLevel(logging.DEBUG)
それは問題ではないようです。実際のログコマンドをlogger.warning
以上に設定すると、ログに出力されます。もちろん、私はdebugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))
のコメントを外すと、Debug.log
にログのアクティビティはありません。私は自分のログレベルを作成したいと思っていましたが、誰か他の人がこのコードを使用している場合は、本当に悪い考えです。
< -------------------------最終更新------------------ --->
まあ私はばかげて、DEBUGレベルのイベントを記録するようにロガー自体を設定するのを忘れてしまった。デフォルトでは、ロギングクラスは警告の下に何も記録しないので、送信するデバッグ情報は記録されませんでした。
最終的な感謝と、フィルタの@Robertへの尽力。
ちょうどので、私はそれをよりよく理解する:ちょうど1ロガーを使用し、各ファイルハンドラが見ているログメッセージをフィルタリングするために、このクラスを使用します(さまざまなレベルのために複数のファイルを作成し、複数のロガーを使用してはいけません) ? – Snaxib
はい、それです。ロガーはアプリケーションのエリアを表し、ハンドラーはイベントのロギングの宛先を表し、いずれかまたは両方にフィルターを適用して、すべての宛先または特定の宛先のイベントを選択的にドロップすることができます。 –
はい。もちろん、複数のロガーを作成することもできますが、debugLog.debug( "foo")などを書くのはかなり面倒です。 – robert