1. ホーム
  2. python

[解決済み] Python のログハンドラごとに異なるレベルを設定する方法

2023-07-21 15:19:42

質問

この件に関するいくつかの投稿を読みましたが、まだ混乱しています。 私はこのロギングを設定しています。

import logging

class MongoHandler(logging.Handler):
    def __init__(self):
        logging.Handler.__init__(self)
        from pymongo import Connection
        self.db = Connection('db_server').db_name

    def emit(self, record):
        try:
            self.db.Logging.save(record.__dict__)
        except:
            print 'Logging Error:  Unable to save log entry to db'

mh = MongoHandler()
sh = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(threadName)s - %(levelname)s - %(message)s')
sh.setFormatter(formatter)
log = logging.getLogger('DeviceMonitor_%s' % hostname)
log.addHandler(mh)
log.addHandler(sh)
log.setLevel(logging.INFO)

StreamHandlerとMongoHandlerに異なるレベルを設定できるようにしたいです。 それは可能ですか、それとも2つ目のLogger objを持つ必要がありますか?

どのように解決するのですか?

ロギング ハンドラごとに異なるロギング レベルを設定できますが、ロガーのレベルを "最低" に設定する必要があるようです。以下の例では、ロガーを DEBUG に、ストリーム ハンドラーを INFO に、TimedRotatingFileHandler を DEBUG に設定しました。そのため、ファイルにはDEBUGのエントリーがあり、ストリームはINFOだけを出力しています。DEBUGだけをあるハンドラへ、INFOだけを別のハンドラへということはできません。そのためには、別のロガーが必要になります。

logger = logging.getLogger("mylog")
formatter = logging.Formatter(
    '%(asctime)s | %(name)s |  %(levelname)s: %(message)s')
logger.setLevel(logging.DEBUG)

stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(formatter)

logFilePath = "my.log"
file_handler = logging.handlers.TimedRotatingFileHandler(
    filename=logFilePath, when='midnight', backupCount=30)
file_handler.setFormatter(formatter)
file_handler.setLevel(logging.DEBUG)

logger.addHandler(file_handler)
logger.addHandler(stream_handler)

logger.info("Started");
try:
    x = 14
    y = 0
    z = x / y
except Exception as ex:
    logger.error("Operation failed.")
    logger.debug(
        "Encountered {0} when trying to perform calculation.".format(ex))

logger.info("Ended");