52

のドキュメントをlogging読んだ後、次のようなコードを使用して簡単なロギングを実行できることがわかりました。

import logging

def main():
    logging.basicConfig(filename="messages.log",
                        level=logging.WARNING,
                        format='%(filename)s: '    
                                '%(levelname)s: '
                                '%(funcName)s(): '
                                '%(lineno)d:\t'
                                '%(message)s')

    logging.debug("Only for debug purposes\n")
    logging.shutdown()

main()

basicConfigただし、モジュールレベルの関数であるため、ロガーごとにログメッセージの形式を変更する方法がわからないことに気付きました。このコードは、さまざまなレベル、名前などでさまざまなロガーを作成するために機能しますが、ロガーごとにこれらのログメッセージの形式を変更する方法もありますbasicConfigか?

import inspect
import logging

def function_logger(level=logging.DEBUG):
    function_name = inspect.stack()[1][3]
    logger = logging.getLogger(function_name)
    logger.setLevel(level)
    logger.addHandler(logging.FileHandler("{0}.log".format(function_name)))
    return logger

def f1():
    f1_logger = function_logger()
    f1_logger.debug("f1 Debug message")
    f1_logger.warning("f1 Warning message")
    f1_logger.critical("f1 Critical message")

def f2():
    f2_logger = function_logger(logging.WARNING)
    f2_logger.debug("f2 Debug message")
    f2_logger.warning("f2 Warning message")
    f2_logger.critical("f2 Critical message")

def main():
    f1()
    f2()
    logging.shutdown()

main()
4

2 に答える 2

89

これを試して

import logging

logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)
# create file handler that logs debug and higher level messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# create formatter and add it to the handlers
formatter = logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(ch)
logger.addHandler(fh)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

詳細については、 http://docs.python.org/howto/logging-cookbook.html#multiple-handlers-and-formattersを参照してください。

于 2012-07-20T15:14:42.723 に答える
2

の既存のサブクラスを作成または使用し、そのインスタンスlogging.Handlerのメソッドをカスタムサブクラスのインスタンスで呼び出す必要があります。出力を変更するロガーに既にアタッチされているハンドラーのフォーマッターを設定する場合は問題ありません。それ以外の場合は、ロガーオブジェクトを取得し、設定したハンドラークラスのインスタンスを使用してそのメソッドを呼び出す必要があります。引数としてフォーマッタをオンにします。setformatter()logger.Formatterlogging.getLogger()addHandler()

于 2012-07-20T15:11:22.240 に答える