I'm creating a Webservice using BaseHTTPServer.HTTPServer
I would like to log the following to be logged to a file rather than to the console. But I have not managed to find a way to do so yet.
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 -
My Code looks like this:
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()
I'm using Python 2.6
If you read the doc or source code for BaseHTTPRequestHandler you'll find that all logging goes thru BaseHTTPRequestHandler.log_message()
, which docstring explicitely specifies:
Log an arbitrary message.
This is used by all other logging functions. Override it if you have specific logging wishes.
So the solution is obviously to leave .send_response()
alone (obviously you want your response to be sent), and replace .log_message()
with either a call to a proper logger (cf http://docs.python.org/2/library/logging.html) which is the clean and flexible way to to handle logging in Python or if you just want an quick hack a write to a filesystem file.
I managed to find a solution.
I created a logger with a FileHandler in the pysimplesoap/server.py
file.
I created the logger right after doing the necessary imports.
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)
Thereafter, within the definition of the SOAPHandler
class, I decided to override the log_message
function as follows:
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))
I managed to suppress BaseHTTPRequestHandler
info on console with:
class https_server(BaseHTTPRequestHandler):
def log_request(self, code):
pass
...
Source
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With