6

ここで 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 に感謝します。

4

1 に答える 1

14

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))
于 2011-09-16T16:12:16.310 に答える