From b014759f8141b4afb5fec240785e8aadcbf09d7e Mon Sep 17 00:00:00 2001 From: lilydjwg Date: Wed, 1 May 2019 17:16:17 +0800 Subject: [PATCH] don't print tracebacks for networking errors closes #108. --- README.rst | 2 +- nvchecker/core.py | 1 + nvchecker/slogconf.py | 23 +++++++++++++++++++++++ nvchecker/source/aiohttp_httpclient.py | 12 ++++++++++-- nvchecker/source/tornado_httpclient.py | 4 +++- sample_source.ini | 2 +- 6 files changed, 39 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 01ebfa4..caf1dfd 100644 --- a/README.rst +++ b/README.rst @@ -162,7 +162,7 @@ newver Specify a version record file to store the new version info. proxy - The HTTP proxy to use. The format is ``host:port``, e.g. ``localhost:8087``. + The HTTP proxy to use. The format is ``proto://host:port``, e.g. ``http://localhost:8087``. max_concurrent Max number of concurrent jobs. Default: 20. diff --git a/nvchecker/core.py b/nvchecker/core.py index 6b26f73..a1d5f8b 100644 --- a/nvchecker/core.py +++ b/nvchecker/core.py @@ -38,6 +38,7 @@ def process_common_arguments(args): '''return True if should stop''' processors = [ slogconf.exc_info, + slogconf.filter_exc, ] logger_factory = None diff --git a/nvchecker/slogconf.py b/nvchecker/slogconf.py index b125b45..32fb5fd 100644 --- a/nvchecker/slogconf.py +++ b/nvchecker/slogconf.py @@ -6,9 +6,12 @@ import logging import os import io import traceback +import sys import structlog +from .source import HTTPError, NetworkErrors + def _console_msg(event): evt = event['event'] if evt == 'up-to-date': @@ -36,6 +39,24 @@ def exc_info(logger, level, event): event['exc_info'] = True return event +def filter_exc(logger, level, event): + exc_info = event.get('exc_info') + if not exc_info: + return event + + if exc_info is True: + exc = sys.exc_info()[1] + else: + exc = exc_info + + if isinstance(exc, HTTPError): + if exc.code == 599: # tornado timeout + del event['exc_info'] + elif isinstance(exc, NetworkErrors): + del event['exc_info'] + event['error'] = exc + return event + def stdlib_renderer(logger, level, event): # return event unchanged for further processing std_event = _console_msg(event.copy()) @@ -45,6 +66,8 @@ def stdlib_renderer(logger, level, event): logger = logging.getLogger() msg = std_event.pop('msg', std_event.pop('event')) exc_info = std_event.pop('exc_info', None) + if 'error' in std_event: + std_event['error'] = repr(std_event['error']) getattr(logger, level)( msg, exc_info = exc_info, extra=std_event, ) diff --git a/nvchecker/source/aiohttp_httpclient.py b/nvchecker/source/aiohttp_httpclient.py index 8b34271..4fd8b4f 100644 --- a/nvchecker/source/aiohttp_httpclient.py +++ b/nvchecker/source/aiohttp_httpclient.py @@ -6,7 +6,7 @@ import asyncio import aiohttp connector = aiohttp.TCPConnector(limit=20) -__all__ = ['session', 'HTTPError'] +__all__ = ['session', 'HTTPError', 'NetworkErrors'] class HTTPError(Exception): def __init__(self, code, message, response): @@ -25,9 +25,17 @@ class BetterClientSession(aiohttp.ClientSession): raise HTTPError(res.status, res.reason, res) return res -session = BetterClientSession(connector=connector) +session = BetterClientSession( + connector = connector, + timeout = aiohttp.ClientTimeout(total=20), +) @atexit.register def cleanup(): loop = asyncio.get_event_loop() loop.run_until_complete(session.close()) + +NetworkErrors = ( + asyncio.TimeoutError, + aiohttp.ClientConnectorError, +) diff --git a/nvchecker/source/tornado_httpclient.py b/nvchecker/source/tornado_httpclient.py index 6329e35..dcf4ae8 100644 --- a/nvchecker/source/tornado_httpclient.py +++ b/nvchecker/source/tornado_httpclient.py @@ -15,7 +15,7 @@ try: except ImportError: pycurl = None -__all__ = ['session', 'HTTPError'] +__all__ = ['session', 'HTTPError', 'NetworkErrors'] client = AsyncHTTPClient() HTTP2_AVAILABLE = None if pycurl else False @@ -73,3 +73,5 @@ async def read(self): HTTPResponse.json = json_response HTTPResponse.read = read session = Session() + +NetworkErrors = () diff --git a/sample_source.ini b/sample_source.ini index a970881..99baf1c 100644 --- a/sample_source.ini +++ b/sample_source.ini @@ -25,7 +25,7 @@ github = lilydjwg/nvchecker [ssed] url = http://sed.sourceforge.net/grabbag/ssed/ regex = The current version is ([\d.]+)\. -proxy = localhost:8087 +proxy = http://localhost:8087 [PySide] pypi = PySide