Overwrite uvicorn loggers.

This commit is contained in:
grossmj 2020-10-22 19:56:53 +10:30
parent 13da8aa8f5
commit 97a91f1899
4 changed files with 48 additions and 19 deletions

View File

@ -21,6 +21,7 @@ import json
import uuid import uuid
import socket import socket
import shutil import shutil
import asyncio
from ..config import Config from ..config import Config
from .project import Project from .project import Project
@ -91,7 +92,7 @@ class Controller:
user=server_config.get("user", ""), user=server_config.get("user", ""),
password=server_config.get("password", ""), password=server_config.get("password", ""),
force=True, force=True,
connect=False) connect=True)
except ControllerError: except ControllerError:
log.fatal("Cannot access to the local server, make sure something else is not running on the TCP port {}".format(port)) log.fatal("Cannot access to the local server, make sure something else is not running on the TCP port {}".format(port))
sys.exit(1) sys.exit(1)
@ -311,7 +312,7 @@ class Controller:
self._computes[compute.id] = compute self._computes[compute.id] = compute
self.save() self.save()
if connect: if connect:
await compute.connect() asyncio.ensure_future(compute.connect())
self.notification.controller_emit("compute.created", compute.__json__()) self.notification.controller_emit("compute.created", compute.__json__())
return compute return compute
else: else:

View File

@ -105,7 +105,7 @@ class Compute:
def _session(self): def _session(self):
if self._http_session is None or self._http_session.closed is True: if self._http_session is None or self._http_session.closed is True:
connector = aiohttp.TCPConnector(force_close=True) connector = aiohttp.TCPConnector(limit=None, force_close=True)
self._http_session = aiohttp.ClientSession(connector=connector) self._http_session = aiohttp.ClientSession(connector=connector)
return self._http_session return self._http_session
@ -464,7 +464,7 @@ class Compute:
elif response.type == aiohttp.WSMsgType.CLOSED: elif response.type == aiohttp.WSMsgType.CLOSED:
pass pass
break break
except aiohttp.ClientError as e: except aiohttp.client_exceptions.ClientResponseError as e:
log.error("Client response error received on compute '{}' WebSocket '{}': {}".format(self._id, ws_url,e)) log.error("Client response error received on compute '{}' WebSocket '{}': {}".format(self._id, ws_url,e))
finally: finally:
self._connected = False self._connected = False
@ -594,8 +594,8 @@ class Compute:
""" """
Forward a call to the emulator on compute Forward a call to the emulator on compute
""" """
action = "/{}/{}".format(type, path)
try: try:
action = "/{}/{}".format(type, path)
res = await self.http_query(method, action, data=data, timeout=None) res = await self.http_query(method, action, data=data, timeout=None)
except aiohttp.ServerDisconnectedError: except aiohttp.ServerDisconnectedError:
raise ControllerError(f"Connection lost to {self._id} during {method} {action}") raise ControllerError(f"Connection lost to {self._id} during {method} {action}")

View File

@ -57,6 +57,11 @@ class ColouredFormatter(logging.Formatter):
colour = self.RESET colour = self.RESET
message = message.replace("#RESET#", self.RESET) message = message.replace("#RESET#", self.RESET)
# do not show uvicorn filename and line number in logs
if record.name.startswith("uvicorn"):
message = message.replace(f"{record.name}:{record.lineno}", "uvicorn")
message = '{colour}{message}{reset}'.format(colour=colour, message=message, reset=self.RESET) message = '{colour}{message}{reset}'.format(colour=colour, message=message, reset=self.RESET)
return message return message
@ -108,7 +113,7 @@ class LogFilter:
This filter some noise from the logs This filter some noise from the logs
""" """
def filter(record): def filter(record):
if record.name == "aiohttp.access" and "/settings" in record.msg and "200" in record.msg: if "/settings" in record.msg and "200" in record.msg:
return 0 return 0
return 1 return 1
@ -150,11 +155,11 @@ def init_logger(level, logfile=None, max_bytes=10000000, backup_count=10, compre
stream_handler.formatter = ColouredFormatter("{asctime} {levelname} {filename}:{lineno} {message}", "%Y-%m-%d %H:%M:%S", "{") stream_handler.formatter = ColouredFormatter("{asctime} {levelname} {filename}:{lineno} {message}", "%Y-%m-%d %H:%M:%S", "{")
else: else:
stream_handler = ColouredStreamHandler(sys.stdout) stream_handler = ColouredStreamHandler(sys.stdout)
stream_handler.formatter = ColouredFormatter("{asctime} {levelname} {filename}:{lineno}#RESET# {message}", "%Y-%m-%d %H:%M:%S", "{") stream_handler.formatter = ColouredFormatter("{asctime} {levelname} {name}:{lineno}#RESET# {message}", "%Y-%m-%d %H:%M:%S", "{")
if quiet: if quiet:
stream_handler.addFilter(logging.Filter(name="user_facing")) stream_handler.addFilter(logging.Filter(name="user_facing"))
logging.getLogger('user_facing').propagate = False logging.getLogger("user_facing").propagate = False
if level > logging.DEBUG: if level > logging.DEBUG:
stream_handler.addFilter(LogFilter) stream_handler.addFilter(LogFilter)
logging.basicConfig(level=level, handlers=[stream_handler]) logging.basicConfig(level=level, handlers=[stream_handler])
return logging.getLogger('user_facing') return stream_handler

View File

@ -23,7 +23,6 @@ Start the program. Use main.py to load it.
import os import os
import datetime import datetime
import sys
import locale import locale
import argparse import argparse
import psutil import psutil
@ -257,14 +256,19 @@ def run():
if args.debug: if args.debug:
level = logging.DEBUG level = logging.DEBUG
user_log = init_logger(level, logfile=args.log, max_bytes=int(args.logmaxsize), backup_count=int(args.logbackupcount), stream_handler = init_logger(level,
compression=args.logcompression, quiet=args.quiet) logfile=args.log,
user_log.info("GNS3 server version {}".format(__version__)) max_bytes=int(args.logmaxsize),
backup_count=int(args.logbackupcount),
compression=args.logcompression,
quiet=args.quiet)
log.info("GNS3 server version {}".format(__version__))
current_year = datetime.date.today().year current_year = datetime.date.today().year
user_log.info("Copyright (c) 2007-{} GNS3 Technologies Inc.".format(current_year)) log.info("Copyright (c) 2007-{} GNS3 Technologies Inc.".format(current_year))
for config_file in Config.instance().get_config_files(): for config_file in Config.instance().get_config_files():
user_log.info("Config file {} loaded".format(config_file)) log.info("Config file {} loaded".format(config_file))
set_config(args) set_config(args)
server_config = Config.instance().get_section_config("Server") server_config = Config.instance().get_section_config("Server")
@ -283,8 +287,10 @@ def run():
if sys.version_info < (3, 6, 0): if sys.version_info < (3, 6, 0):
raise SystemExit("Python 3.6 or higher is required") raise SystemExit("Python 3.6 or higher is required")
user_log.info("Running with Python {major}.{minor}.{micro} and has PID {pid}".format(major=sys.version_info[0], minor=sys.version_info[1], log.info("Running with Python {major}.{minor}.{micro} and has PID {pid}".format(major=sys.version_info[0],
micro=sys.version_info[2], pid=os.getpid())) minor=sys.version_info[1],
micro=sys.version_info[2],
pid=os.getpid()))
# check for the correct locale (UNIX/Linux only) # check for the correct locale (UNIX/Linux only)
locale_check() locale_check()
@ -304,8 +310,25 @@ def run():
try: try:
log.info("Starting server on {}:{}".format(host, port)) log.info("Starting server on {}:{}".format(host, port))
#uvicorn.run("app:app", host=host, port=port, log_level="info")#, reload=True)
config = uvicorn.Config("gns3server.app:app", host=host, port=port, access_log=True) # only show uvicorn access logs in debug mode
access_log = False
if log.getEffectiveLevel() == logging.DEBUG:
access_log = True
config = uvicorn.Config("gns3server.app:app", host=host, port=port, access_log=access_log)
# overwrite uvicorn loggers with our own logger
for uvicorn_logger_name in ("uvicorn", "uvicorn.error"):
uvicorn_logger = logging.getLogger(uvicorn_logger_name)
uvicorn_logger.handlers = [stream_handler]
uvicorn_logger.propagate = False
if access_log:
uvicorn_logger = logging.getLogger("uvicorn.access")
uvicorn_logger.handlers = [stream_handler]
uvicorn_logger.propagate = False
server = uvicorn.Server(config) server = uvicorn.Server(config)
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
loop.run_until_complete(server.serve()) loop.run_until_complete(server.serve())