31 lines
1.1 KiB
Python
31 lines
1.1 KiB
Python
"""Keep the latest log records in memory for the system page."""
|
|
import collections
|
|
import datetime
|
|
import logging
|
|
|
|
# shortcut: lost on restart, write to /config if older entries are ever needed
|
|
RECORDS: collections.deque[dict] = collections.deque(maxlen=200)
|
|
|
|
|
|
class _Buffer(logging.Handler):
|
|
def emit(self, record: logging.LogRecord) -> None:
|
|
RECORDS.append({
|
|
"at": datetime.datetime.fromtimestamp(record.created, datetime.UTC).isoformat(),
|
|
"level": record.levelname,
|
|
"logger": record.name,
|
|
"message": self.format(record),
|
|
})
|
|
|
|
|
|
def install() -> None:
|
|
"""A handler on root would silence the last-resort stderr output, so
|
|
basicConfig keeps the container log. uvicorn's loggers do not propagate,
|
|
its errors are caught on uvicorn.error itself."""
|
|
if any(isinstance(h, _Buffer) for h in logging.getLogger().handlers):
|
|
return
|
|
logging.basicConfig(format="%(levelname)s:%(name)s: %(message)s")
|
|
logging.getLogger("wordarr").setLevel(logging.INFO)
|
|
buffer = _Buffer(logging.INFO)
|
|
logging.getLogger().addHandler(buffer)
|
|
logging.getLogger("uvicorn.error").addHandler(buffer)
|