From 0abf2e82d6dcf46a18b5734bc8ff9d088b8f828c Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Thu, 5 Feb 2015 15:35:52 +0100 Subject: [PATCH] Improve server debug logging --- gns3server/server.py | 3 ++- gns3server/web/request_handler.py | 28 ++++++++++++++++++++++++++++ gns3server/web/response.py | 15 +++++++++------ 3 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 gns3server/web/request_handler.py diff --git a/gns3server/server.py b/gns3server/server.py index 3e19cdcf..349880e5 100644 --- a/gns3server/server.py +++ b/gns3server/server.py @@ -29,6 +29,7 @@ import types import time from .web.route import Route +from .web.request_handler import RequestHandler from .config import Config from .modules import MODULES from .modules.port_manager import PortManager @@ -54,7 +55,7 @@ class Server: def _run_application(self, app, ssl_context=None): try: - server = yield from self._loop.create_server(app.make_handler(), self._host, self._port, ssl=ssl_context) + server = yield from self._loop.create_server(app.make_handler(handler=RequestHandler), self._host, self._port, ssl=ssl_context) except OSError as e: log.critical("Could not start the server: {}".format(e)) self._loop.stop() diff --git a/gns3server/web/request_handler.py b/gns3server/web/request_handler.py new file mode 100644 index 00000000..b7fbb121 --- /dev/null +++ b/gns3server/web/request_handler.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2015 GNS3 Technologies Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import aiohttp.web +import logging + + +class RequestHandler(aiohttp.web.RequestHandler): + + def log_access(self, message, environ, response, time): + # In debug mode we don't use the standard request log but a more complete in response.py + print(self.logger.getEffectiveLevel()) + if self.logger.getEffectiveLevel() != logging.DEBUG: + super().log_access(message, environ, response, time) diff --git a/gns3server/web/response.py b/gns3server/web/response.py index eff5b165..366b8a6c 100644 --- a/gns3server/web/response.py +++ b/gns3server/web/response.py @@ -36,14 +36,17 @@ class Response(aiohttp.web.Response): super().__init__(headers=headers, **kwargs) def start(self, request): - log.debug("{} {}".format(self.status, self.reason)) - log.debug(dict(self.headers)) + if log.getEffectiveLevel() == logging.DEBUG: + log.info("%s %s", request.method, request.path_qs) + log.debug("%s", dict(request.headers)) + if isinstance(request.json, dict): + log.debug("%s", request.json) + log.info("Response: %d %s", self.status, self.reason) + log.debug(dict(self.headers)) + if hasattr(self, 'body'): + log.debug(json.loads(self.body.decode('utf-8'))) return super().start(request) - def write(self, data): - log.debug(data) - return super().write(data) - def json(self, answer): """ Set the response content type to application/json and serialize