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 のドキュメントまたはソース コードを読むと、すべてのログが を通過することがわかります。BaseHTTPRequestHandler.log_message()これは、docstring で明示的に指定されています。

任意のメッセージを記録します。

これは、他のすべてのロギング機能で使用されます。特定のロギングが必要な場合は、オーバーライドしてください。

したがって、解決策は明らかにそのままにし.send_response()(明らかに応答を送信したい)、.log_message()適切なロガーへの呼び出し(http://docs.python.org/2/library/logging.htmlを参照)に置き換えることです。は、Python でログを処理するためのクリーンで柔軟な方法です。

于 2013-11-29T09:25:37.300 に答える
6

私は解決策を見つけることができました。

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))
于 2013-11-29T19:11:00.040 に答える