如何覆盖BaseHTTPRequestHandler log_message()方法以记录到文件而不是控制台(sys.stderr)?

Phi*_*hil 7 python logging basehttpserver basehttprequesthandler

我正在使用BaseHTTPServer.HTTPServer创建Web服务

我想记录以下内容以记录到文件而不是控制台.但我还没有设法找到办法.

10.23.23.19 - - [29/Nov/2013 08:39:06] "GET / HTTP/1.1" 200 -
10.23.23.19 - - [29/Nov/2013 08:39:06] "POST / HTTP/1.1" 200 -
10.24.20.14 - - [29/Nov/2013 08:39:27] "POST / HTTP/1.1" 200 -
10.24.20.14 - - [29/Nov/2013 08:39:31] "POST / HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud)

我的代码看起来像这样:

from BaseHTTPServer import HTTPServer
from pysimplesoap.server import SoapDispatcher, SOAPHandler
.
# The rest of the code
.
.
httpd = HTTPServer(("", 8059),SOAPHandler)
    httpd.dispatcher = dispatcher
    httpd.serve_forever()
Run Code Online (Sandbox Code Playgroud)

我正在使用Python 2.6

bru*_*ers 7

如果您阅读BaseHTTPRequestHandler的文档或源代码,您会发现所有日志记录都是通过BaseHTTPRequestHandler.log_message(),docstring明确指定:

记录任意消息.

所有其他日志记录功能都使用此功能.如果您有特定的日志记录愿望,请覆盖它.

所以解决方案显然是.send_response()单独留下(显然你希望发送你的响应),并用.log_message()一个适当的记录器(参见http://docs.python.org/2/library/logging.html)替换它.是一种干净而灵活的方法来处理Python中的日志记录,或者如果您只是想快速入侵文件系统文件.


Phi*_*hil 5

我设法找到了解决方案。

我在pysimplesoap/server.py文件中创建了一个带有 FileHandler 的记录器。我在完成必要的导入后立即创建了记录器。

httpdkenlogger = logging.getLogger('httpd-ken')
#setup file handler
fh = logging.FileHandler('/opt/python/dev/interim/httpd-kenserver.3.log')
fh.setLevel(logging.INFO)
frmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(frmt)
# Add this handler to the logger
httpdkenlogger.addHandler(fh)
Run Code Online (Sandbox Code Playgroud)

此后,在SOAPHandler类的定义中,我决定log_message按如下方式覆盖该函数:

class SOAPHandler(BaseHTTPRequestHandler):
    def log_message(self, format, *args):
        httpdkenlogger.info("%s - - [%s] %s\n" % (self.address_string(),self.log_date_time_string(),format%args))
Run Code Online (Sandbox Code Playgroud)