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

1

您正在向“LogWriter”记录器添加一个处理程序,但记录到根记录器,它没有添加任何处理程序。

添加处理程序和设置级别不是一个好习惯,除了从if __name__ == '__main__'子句中只添加一次,从您发布的代码中并不清楚您是否遵循了正确的做法。

于 2013-09-29T22:44:57.753 回答
0

cox 和 Vinay 都是正确的,但没有提供明确的解决方案。cox 的解决方案没有完全起作用,因为他建议的定义将硬编码不允许通过调用修改的严重性

所以我不再将 device_ID、严重性和消息传递给类,而是直接传递给 log() 函数

这是我完成这项工作的最简单方法。

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

更换

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

正如 Vinay 所说,最佳实践是不要在类定义中创建处理程序。我找到的解决方案是定义一个单独的记录器模块,将处理程序附加到模块中的类定义之外,在调用程序中只创建一次新记录器,然后每个新记录器请求都可以按照解释记录到子日志在日志记录食谱中。

于 2013-09-30T04:06:52.397 回答