Replace root logger calls with module-specific loggers

This commit is contained in:
Ian Renton
2026-08-15 08:35:06 +01:00
parent 74bcd9cded
commit dd89ff4af7
64 changed files with 328 additions and 216 deletions
+5 -3
View File
@@ -18,6 +18,8 @@ from core.utils import infer_band_from_freq, safe_json_dumps
from data.spot import Spot
from providers.spot.spot_provider import SpotProvider
logger = logging.getLogger(__name__)
RECAPTCHA_VERIFY_URL = "https://www.google.com/recaptcha/api/siteverify"
@@ -220,7 +222,7 @@ class APISpotHandler(tornado.web.RequestHandler):
except NotImplementedError as e:
upstream_warning = str(e)
except Exception:
logging.exception(f"Failed to submit spot upstream to {upstream_provider_name}")
logger.exception(f"Failed to submit spot upstream to {upstream_provider_name}")
upstream_warning = (
f"Spot was saved locally but upstream submission to {upstream_provider_name} failed."
)
@@ -244,7 +246,7 @@ class APISpotHandler(tornado.web.RequestHandler):
self.set_header("Content-Type", "application/json")
except Exception:
logging.exception("Exception when handling client request to add spot API")
logger.exception("Exception when handling client request to add spot API")
self.write(safe_json_dumps("Error - an internal server error occurred."))
self.set_status(500)
self.set_header("Cache-Control", "no-store")
@@ -270,5 +272,5 @@ class APISpotHandler(tornado.web.RequestHandler):
)
return response.ok and response.json().get("success", False)
except Exception:
logging.exception("reCAPTCHA verification request failed")
logger.exception("reCAPTCHA verification request failed")
return False
+5 -3
View File
@@ -13,6 +13,8 @@ from core.prometheus_metrics_handler import api_requests_counter
from core.utils import safe_json_dumps
from data.lookup_credentials import extract_credentials
logger = logging.getLogger(__name__)
class APIAlertsHandler(tornado.web.RequestHandler):
"""API request handler for /api/v2/alerts"""
@@ -63,7 +65,7 @@ class APIAlertsHandler(tornado.web.RequestHandler):
self.write(safe_json_dumps(f"Bad request - {e!s}"))
self.set_status(400)
except Exception:
logging.exception("Exception when handling client request to alerts API")
logger.exception("Exception when handling client request to alerts API")
self.write(safe_json_dumps("Error - an internal server error occurred."))
self.set_status(500)
self.set_header("Cache-Control", "no-store")
@@ -110,7 +112,7 @@ class APIAlertsStreamHandler(tornado_eventsource.handler.EventSourceHandler):
self._sse_alert_broadcaster.register(self)
except Exception:
logging.exception("Exception when serving SSE socket")
logger.exception("Exception when serving SSE socket")
self.close()
def close(self):
@@ -129,7 +131,7 @@ class APIAlertsStreamHandler(tornado_eventsource.handler.EventSourceHandler):
alert.infer_missing(self._credentials)
self.write_message(msg=safe_json_dumps(alert))
except Exception:
logging.exception("Exception in SSE callback, connection will be closed")
logger.exception("Exception in SSE callback, connection will be closed")
self.close()
+3 -1
View File
@@ -12,6 +12,8 @@ from tornado.web import Application
from core.prometheus_metrics_handler import api_requests_counter
from core.utils import safe_json_dumps
logger = logging.getLogger(__name__)
CONTINENTS = ["EU", "NA", "SA", "AS", "AF", "OC", "AN"]
BANDS = ["160m", "80m", "60m", "40m", "30m", "20m", "17m", "15m", "12m", "10m", "6m"]
CONTINENTS_SET = frozenset(CONTINENTS)
@@ -68,6 +70,6 @@ class APIDxStatsHandler(tornado.web.RequestHandler):
self.set_header("Content-Type", "application/json")
except Exception:
logging.exception("Exception when handling client request to dx stats API")
logger.exception("Exception when handling client request to dx stats API")
self.write(safe_json_dumps("Error - an internal server error occurred."))
self.set_status(500)
+5 -3
View File
@@ -22,6 +22,8 @@ from core.utils import safe_json_dumps
from data.lookup_credentials import extract_credentials
from data.sig_ref import SIGRef
logger = logging.getLogger(__name__)
class APILookupCallHandler(tornado.web.RequestHandler):
"""API request handler for /api/v2/lookup/call"""
@@ -66,7 +68,7 @@ class APILookupCallHandler(tornado.web.RequestHandler):
self.set_status(422)
except Exception:
logging.exception("Exception when handling client request to call lookup API")
logger.exception("Exception when handling client request to call lookup API")
self.write(safe_json_dumps("Error - an internal server error occurred."))
self.set_status(500)
@@ -124,7 +126,7 @@ class APILookupSIGRefHandler(tornado.web.RequestHandler):
self.set_status(422)
except Exception:
logging.exception("Exception when handling client request to sig ref lookup API")
logger.exception("Exception when handling client request to sig ref lookup API")
self.write(safe_json_dumps("Error - an internal server error occurred."))
self.set_status(500)
@@ -192,7 +194,7 @@ class APILookupGridHandler(tornado.web.RequestHandler):
self.set_status(422)
except Exception:
logging.exception("Exception when handling client request to grid ref lookup API")
logger.exception("Exception when handling client request to grid ref lookup API")
self.write(safe_json_dumps("Error - an internal server error occurred."))
self.set_status(500)
+3 -1
View File
@@ -19,6 +19,8 @@ from core.constants import (
from core.prometheus_metrics_handler import api_requests_counter
from core.utils import safe_json_dumps
logger = logging.getLogger(__name__)
class APIOptionsHandler(tornado.web.RequestHandler):
"""API request handler for /api/v2/options"""
@@ -119,6 +121,6 @@ class APIOptionsHandler(tornado.web.RequestHandler):
self.set_header("Content-Type", "application/json")
except Exception:
logging.exception("Exception when handling client request to options API")
logger.exception("Exception when handling client request to options API")
self.write(safe_json_dumps("Error - an internal server error occurred."))
self.set_status(500)
+3 -1
View File
@@ -10,6 +10,8 @@ from tornado.web import Application
from core.prometheus_metrics_handler import api_requests_counter
from core.utils import safe_json_dumps
logger = logging.getLogger(__name__)
class APISolarConditionsHandler(tornado.web.RequestHandler):
"""API request handler for /api/v2/solar"""
@@ -42,6 +44,6 @@ class APISolarConditionsHandler(tornado.web.RequestHandler):
self.set_header("Content-Type", "application/json")
except Exception:
logging.exception("Exception when handling client request to solar conditions API")
logger.exception("Exception when handling client request to solar conditions API")
self.write(safe_json_dumps("Error - an internal server error occurred."))
self.set_status(500)
+5 -3
View File
@@ -13,6 +13,8 @@ from core.prometheus_metrics_handler import api_requests_counter
from core.utils import safe_json_dumps
from data.lookup_credentials import extract_credentials
logger = logging.getLogger(__name__)
class APISpotsHandler(tornado.web.RequestHandler):
"""API request handler for /api/v2/spots"""
@@ -63,7 +65,7 @@ class APISpotsHandler(tornado.web.RequestHandler):
self.write(safe_json_dumps(f"Bad request - {e!s}"))
self.set_status(400)
except Exception:
logging.exception("Excedption when handling client request to spots API")
logger.exception("Excedption when handling client request to spots API")
self.write(safe_json_dumps("Error - an internal server error occurred."))
self.set_status(500)
self.set_header("Cache-Control", "no-store")
@@ -112,7 +114,7 @@ class APISpotsStreamHandler(tornado_eventsource.handler.EventSourceHandler):
self._sse_spot_broadcaster.register(self)
except Exception:
logging.exception("Exception when serving SSE socket")
logger.exception("Exception when serving SSE socket")
self.close()
def close(self):
@@ -132,7 +134,7 @@ class APISpotsStreamHandler(tornado_eventsource.handler.EventSourceHandler):
spot.infer_missing(self._credentials)
self.write_message(msg=safe_json_dumps(spot))
except Exception:
logging.exception("Exception in SSE callback, connection will be closed")
logger.exception("Exception in SSE callback, connection will be closed")
self.close()
+3 -1
View File
@@ -10,6 +10,8 @@ from tornado.web import Application
from core.prometheus_metrics_handler import api_requests_counter
from core.utils import safe_json_dumps
logger = logging.getLogger(__name__)
class APIStatusHandler(tornado.web.RequestHandler):
"""API request handler for /api/v2/status"""
@@ -42,6 +44,6 @@ class APIStatusHandler(tornado.web.RequestHandler):
self.set_header("Content-Type", "application/json")
except Exception:
logging.exception("Exception when handling client request to status API")
logger.exception("Exception when handling client request to status API")
self.write(safe_json_dumps("Error - an internal server error occurred."))
self.set_status(500)
+3 -1
View File
@@ -15,6 +15,8 @@ from core.sig_utils import get_ref_regex_for_sig
from core.utils import infer_band_from_freq, safe_json_dumps
from data.spot import Spot
logger = logging.getLogger(__name__)
class V1APISpotHandler(tornado.web.RequestHandler):
"""API request handler for /api/v1/spot (POST). Included in early Spothole v2 for backwards compatibility."""
@@ -143,7 +145,7 @@ class V1APISpotHandler(tornado.web.RequestHandler):
self.set_header("Content-Type", "application/json")
except Exception:
logging.exception("Exception when handling client request to add spot API")
logger.exception("Exception when handling client request to add spot API")
self.write(safe_json_dumps("Error - an internal server error occurred."))
self.set_status(500)
self.set_header("Cache-Control", "no-store")
+3 -1
View File
@@ -3,6 +3,8 @@ import threading
from tornado.ioloop import IOLoop
logger = logging.getLogger(__name__)
class SSEBroadcaster:
"""Bridge between DataStore listener callbacks (which fire on provider threads) to Tornado's async SSE handlers
@@ -35,5 +37,5 @@ class SSEBroadcaster:
handler.callback(value)
except Exception:
# Connection probably dropped, ignore and de-register the handler to stop getting future items.
logging.debug("Failed to push to an SSE client; dropping it")
logger.debug("Failed to push to an SSE client; dropping it")
self.unregister(handler)
+7 -5
View File
@@ -34,6 +34,8 @@ from server.handlers.metrics import PrometheusMetricsHandler
from server.handlers.pagetemplate import PageTemplateHandler
from server.sse_broadcaster import SSEBroadcaster
logger = logging.getLogger(__name__)
_HERE = os.path.dirname(__file__ or "")
@@ -159,7 +161,7 @@ class WebServer:
# If in API-only mode, serve a basic homepage; in normal mode, serve the usual UI routes
if self._api_only_mode:
logging.info("API-only mode is enabled. Web UI will not be served.")
logger.info("API-only mode is enabled. Web UI will not be served.")
ui_routes = [
(
r"/",
@@ -238,8 +240,8 @@ class WebServer:
debug=False,
)
app.listen(self._port, xheaders=True)
logging.info(f"Web server running on port {WEB_SERVER_PORT!s}")
logging.info(f"You can access your copy of Spothole at {BASE_URL}")
logger.info(f"Web server running on port {WEB_SERVER_PORT!s}")
logger.info(f"You can access your copy of Spothole at {BASE_URL}")
await self._shutdown_event.wait()
@@ -249,9 +251,9 @@ def request_log(handler):
if LOG_WEB_REQUESTS:
if handler.get_status() < 500:
log_method = logging.info
log_method = logger.info
else:
log_method = logging.warning
log_method = logger.warning
request = handler.request
client_ip = request.remote_ip