8

我正在使用 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 -

我的代码如下所示:

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()

我正在使用 Python 2.6

4

3 回答 3

9

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

记录任意消息。

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

因此,解决方案显然是不理会.send_response()(显然您希望发送响应),并替换.log_message()为对适当记录器的调用(参见http://docs.python.org/2/library/logging.html)是在 Python 中处理日志记录的干净而灵活的方法,或者如果您只是想快速 hack 写入文件系统文件。

于 2013-11-29T09:25:37.300 回答
6

我设法找到了解决方案。

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

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)

此后,在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))
于 2013-11-29T19:11:00.040 回答
1

I managed to suppress BaseHTTPRequestHandler info on console with:

class https_server(BaseHTTPRequestHandler):
    def log_request(self, code): 
        pass
    ...

Source

于 2018-10-15T02:41:12.360 回答