1

これは、logging cookbook hereの助けを借りて書き ました。このコードは、「デバイス」ごとに 1 行を書き込むことになっていました。ログファイルを作成しますが、中には何も書き込まれません。

#!/usr/bin/env python

from __future__ import unicode_literals

import json
import logging
import glob
import logging.handlers

# This next bit is to ensure the script runs unchanged on 2.x and 3.x
try:
    unicode
except NameError:
    unicode = str

class LogWriter:
    Name = 'LogWriter'
    def __init__(self, Device_ID, Severity, Message):
        self.id = Device_ID
        self.severity = Severity
        self.message = Message
        self.logfile = './log/log_'+self.id+'.log'

    def log(self):
        # Set up a specific logger with our desired output level
        logwriter = logging.getLogger('LogWriter')
        logwriter.setLevel(logging.INFO)

        # Add the log message handlers to the logger
        timedRotatingLogFileHandler = logging.handlers.TimedRotatingFileHandler(self.logfile, when = 'midnight', backupCount=2)
        #setup formatting
        formatter = logging.Formatter('%(asctime)s %(processName)-10s %(name)s %(levelname)-8s %(message)s')
        timedRotatingLogFileHandler.setFormatter(formatter)
        logwriter.addHandler(timedRotatingLogFileHandler)

        try:
            logging.info(self.message, self.severity)
        except:
            return 1
        return 0

def main():
    for i in range(20):
        logger = LogWriter(str(i), 'INFO', 'hello'+str(i))
        logger.log()


if __name__ == '__main__':
    main()

これがうまくいかない理由を誰か教えてください。

4

2 に答える 2

0

cox と Vinay はどちらも正しかったのですが、明確な解決策は提供されていませんでした。cox のソリューションは完全には機能しませんでした

そのため、device_ID、重大度、およびメッセージをクラスに渡すのではなく、直接 log() 関数に渡します

これは私がこれを成し遂げた最も簡単な方法でした。

a = getattr(logwriter, severity) 
a(message)

交換する

logging.info(self.message, self.severity)

Vinay が言ったように、ベスト プラクティスは、クラス定義内にハンドラーを作成しないことです。そのために私が見つけた解決策は、別のロガーモジュールを定義し、モジュールのクラス定義の外側にハンドラーをアタッチし、呼び出しプログラムで新しいロガーを1回だけ作成し、説明したように、新しいロガーリクエストごとに子ログにログを記録することですロギングクックブックで。

于 2013-09-30T04:06:52.397 に答える