当我在`SimpleHTTPRequestHandler`中覆盖`log_message()`时,没有任何内容写入文件

时间:2012-02-02 10:13:55

标签: python logging

我有一个网络服务器的代码。我有一个问题,即在httpd.log中没有打印任何内容 - 我无能为力。文件被创建,如果我向print()添加log_message()语句,则会打印出来,但是没有任何内容写入文件。

from http.server import HTTPServer
from http.server import SimpleHTTPRequestHandler
import logging
from logging.handlers import RotatingFileHandler

class MyHandler(SimpleHTTPRequestHandler):
    def __init__(self, *args):
        self.logger = logging.getLogger("httpd")
        formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        fh = RotatingFileHandler("httpd.log", mode='wa',
                maxBytes=1 << 20, backupCount=2)
        fh.setFormatter(formatter)
        fh.setLevel(logging.INFO)
        self.logger.addHandler(fh)
        self.logger.info("Creating HTTP Request Handler")
        super(SimpleHTTPRequestHandler, self).__init__(*args)

    def log_message(self, format, *args):
        self.logger.info("%s - - [%s] %s\n" %
                         (self.address_string(),
                          self.log_date_time_string(),
                          format%args))

def main():
  server = HTTPServer(('', 80), MyHandler)
  server.serve_forever()

if __name__ == '__main__':
  main()

这是在Python 3.1.3

3 个答案:

答案 0 :(得分:4)

记录器可以有多个处理程序。不同的处理程序可能具有不同的日志级别记录器有自己的日志级别,不受处理程序的影响,并将具有适当日志级别的消息传递给处理程序,以便他们认为合适。

因此,当您的处理程序对INFO级别消息感兴趣时,您的记录器会忽略它们。

WARNING的默认日志级别是从根记录器继承的。

答案 1 :(得分:1)

除了致电self.logger.setLevel(logging.INFO)

之外,我还需要致电fh.setLevel()

如果有人解释为什么,我会接受这个答案:)

答案 2 :(得分:-1)

 open(LOGFILE, "w+").write("%s - - [%s] %s\n" % (self.address_string(), self.log_date_time_string(), format%args)) 

这是您可能感兴趣的内容。