ここで python logging クラスのチュートリアルを調べましたが、同じ出力に対して異なるレベルの複数のログを作成できるものは何もありませんでした。最後に、3 つのログを取得したいと思います:
<timestamp>_DEBUG.log
(デバッグ レベル)
<timestamp>_INFO.log
(情報レベル)
<timestamp>_ERROR.log
(エラー レベル)
1 つのスクリプトで、同じ入力に対して複数のログ ファイルを生成する方法はありますか?
<-------------UPDATE #1 --------------------------->
したがって、@robert の提案を実装する際に、おそらく彼のコードで何が行われているのかを完全に理解していないために、小さな問題があります。
これが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])
これが実行されているものの例は次のとおりです。
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
時にエラーはスローされず、error.log
作成されますが、エントリが入力されるdebug.log
だけです。error.log
理由はありますか?
<------------------------更新#2---------------------- ->
そのため、警告よりも「低い」ものは何もログに記録されていないことに気付きました。フィルターを外してもdebugLogFileHandler.setLevel(logging.DEBUG)
問題ないようです。実際のログ コマンドをlogger.warning
以上に設定すると、ログに出力されます。もちろん、コメントを外すdebugLogFileHandler.addFilter(LevelFilter(logging.DEBUG))
と、ログ アクティビティは表示されませんDebug.log
。私は自分自身のログ レベルを作成したくなりますが、誰か/他の誰かがこのコードを使用する場合に備えて、それは本当に悪い考えのようです。
<-----------------------------最終更新--------------------->
まあ、私は愚かで、ロガー自体を DEBUG レベルのイベントをログに記録するように設定するのを忘れていました。デフォルトでは、ログ クラスは警告以下のログを記録しないため、送信したデバッグ情報はログに記録されませんでした。
最後に、フィルターについて @Robert に感謝します。