簡體   English   中英

如何覆蓋 BaseHTTPRequestHandler log_message() 方法以記錄到文件而不是控制台 (sys.stderr)?

[英]How do you override BaseHTTPRequestHandler log_message() method to log to a file rather than to console (sys.stderr)?

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

如果您閱讀BaseHTTPRequestHandler的文檔或源代碼,您會發現所有日志記錄都通過BaseHTTPRequestHandler.log_message() ,docstring明確指定:

記錄任意消息。

所有其他日志記錄功能都使用此功能。 如果您有特定的日志記錄願望,請覆蓋它。

所以解決方案顯然是單獨留下.send_response() (顯然你希望發送你的響應),並用調用適當的記錄器替換.log_message() (參見http://docs.python.org/2 /library/logging.html )這是處理Python日志記錄的干凈而靈活的方法,或者你只是想快速破解文件系統文件的寫入。

我設法找到了解決方案。

我在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)

此后,在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))

我設法在控制台上抑制BaseHTTPRequestHandler信息:

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

資源

在手冊中說:

BaseHTTPRequestHandler has the following instance variables:

log_message(format, ...)

這里的參數沒有列出,但通過反復試驗:

class MyClass(BaseHTTPRequestHandler):

    def fn( self, *args ):
        print( args )

    def do_POST(self):
        self.log_message = self.fn

有四個參數顯示(第一個是格式,然后是請求信息,狀態代碼和一個其他字段。

所以使用類似的東西:

    def myLog( self, fmt, request, code, other ):
        syslog( LOG_INFO, '%s %s' % ( code, request) )

    def do_POST(self):
        self.log_message = self.myLog

可以登錄到您自己的端點。

我看到的唯一缺點是有必要在每個處理程序實例上替換log_message

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM