Skip to content

Commit f0f02ae

Browse files
committed
Properly handle access log handlers
1 parent 4810247 commit f0f02ae

File tree

3 files changed

+47
-9
lines changed

3 files changed

+47
-9
lines changed

src/labthings/server/logging.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,4 @@ def emit(self, record):
1515
current_labthing().emit("logging", log_event)
1616

1717
def rest_format_record(self, record):
18-
return {"message": str(record.msg), "level": record.levelname.lower()}
18+
return {"message": str(record.msg), "level": record.levelname.lower()}

src/labthings/server/wsgi/gevent.py

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from geventwebsocket.handler import WebSocketHandler
21
import gevent
32
import socket
43
import signal
@@ -7,17 +6,19 @@
76

87
from zeroconf import IPVersion, ServiceInfo, Zeroconf, get_all_addresses
98

9+
from .handler import WebSocketHandler
1010
from ..find import current_labthing
1111

12+
sentinel = object()
1213

1314
class Server:
1415
def __init__(
1516
self,
1617
app,
1718
host="0.0.0.0",
1819
port=7485,
19-
log=None,
20-
error_log=None,
20+
log=sentinel,
21+
error_log=sentinel,
2122
debug=False,
2223
zeroconf=True,
2324
):
@@ -82,15 +83,18 @@ def register_zeroconf(self):
8283
def stop(self):
8384
# Unregister zeroconf service
8485
if self.zeroconf_server:
86+
logging.info("Unregistering zeroconf services")
8587
for service in self.service_infos:
8688
self.zeroconf_server.unregister_service(service)
8789
self.zeroconf_server.close()
8890
# Stop WSGI server with timeout
8991
if self.wsgi_server:
92+
logging.info("Shutting down WSGI server")
9093
self.wsgi_server.stop(timeout=5)
9194
# Clear started event
9295
if self.started_event.is_set():
9396
self.started_event.clear()
97+
logging.info("Done")
9498

9599
def start(self):
96100
# Unmodified version of app
@@ -101,10 +105,16 @@ def start(self):
101105
self.register_zeroconf()
102106

103107
# Handle logging
104-
if not self.log:
108+
if self.log is sentinel:
109+
print("No access log specified. Using root.")
105110
self.log = logging.getLogger()
106-
if not self.error_log:
111+
if not self.log:
112+
self.log = logging.NullHandler()
113+
if self.error_log is sentinel:
114+
print("No error og specified. Using root.")
107115
self.error_log = logging.getLogger()
116+
if not self.error_log:
117+
self.error_log = logging.NullHandler()
108118

109119
# Handle debug mode
110120
if self.debug:
@@ -116,6 +126,8 @@ def start(self):
116126
friendlyhost = "localhost" if self.host == "0.0.0.0" else self.host
117127
print("Starting LabThings WSGI Server")
118128
print(f"Debug mode: {self.debug}")
129+
print(f"Access log: {self.log}")
130+
print(f"Error log: {self.error_log}")
119131
print(f"Running on http://{friendlyhost}:{self.port} (Press CTRL+C to quit)")
120132

121133
# Create WSGIServer
@@ -124,6 +136,7 @@ def start(self):
124136
app_to_run,
125137
handler_class=WebSocketHandler,
126138
log=self.log,
139+
error_log=self.error_log
127140
)
128141

129142
# Serve
@@ -140,7 +153,7 @@ def start(self):
140153
self.stop() # pragma: no cover
141154

142155
def run(
143-
self, host=None, port=None, log=None, error_log=None, debug=None, zeroconf=None,
156+
self, host=None, port=None, log=sentinel, error_log=sentinel, debug=None, zeroconf=None,
144157
):
145158
"""Starts the server allowing for runtime parameters. Designed to immitate
146159
the old Flask app.run style of starting an app
@@ -158,10 +171,10 @@ def run(
158171
if host is not None:
159172
self.host = str(host)
160173

161-
if log is not None:
174+
if log is not sentinel:
162175
self.log = log
163176

164-
if error_log is not None:
177+
if error_log is not sentinel:
165178
self.error_log = error_log
166179

167180
if debug is not None:
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from geventwebsocket.handler import WebSocketHandler as _WebSocketHandler
2+
3+
from logging import getLogger, StreamHandler, getLoggerClass, Formatter, DEBUG
4+
5+
def create_logger(name, handlers=None, debug=False):
6+
if not handlers:
7+
handlers = ()
8+
9+
logger = getLogger(name)
10+
11+
for handler in handlers:
12+
logger.addHandler(handler)
13+
14+
return logger
15+
16+
class WebSocketHandler(_WebSocketHandler):
17+
@property
18+
def logger(self):
19+
if not hasattr(self, "_logger"):
20+
if hasattr(self.server, 'log'):
21+
self._logger = create_logger(__name__, handlers=(self.server.log, ))
22+
else:
23+
self._logger = create_logger(__name__)
24+
25+
return self._logger

0 commit comments

Comments
 (0)