Compare commits
3 Commits
f9943dc1c4
...
3afcfd5856
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3afcfd5856 | ||
|
|
342c0a2285 | ||
|
|
8161fb00b3 |
52
app/log.py
Normal file → Executable file
52
app/log.py
Normal file → Executable file
@ -1,56 +1,54 @@
|
||||
#!/usr/bin/python3
|
||||
#!/usr/bin/env python3
|
||||
# Standard library imports
|
||||
import logging
|
||||
import logging.config
|
||||
import logging.handlers
|
||||
import os
|
||||
import sys
|
||||
from traceback import print_exception
|
||||
import yaml
|
||||
|
||||
# PyQt imports
|
||||
|
||||
# Third party imports
|
||||
import colorlog
|
||||
import stackprinter # type: ignore
|
||||
|
||||
# App imports
|
||||
from config import Config
|
||||
|
||||
|
||||
class FunctionFilter(logging.Filter):
|
||||
"""Filter to allow category-based logging to stderr."""
|
||||
|
||||
def __init__(self, functions: set[str]):
|
||||
super().__init__()
|
||||
self.functions = functions
|
||||
|
||||
def filter(self, record: logging.LogRecord) -> bool:
|
||||
return (
|
||||
getattr(record, "funcName", None) in self.functions
|
||||
and getattr(record, "levelname", None) == "DEBUG"
|
||||
)
|
||||
|
||||
|
||||
class LevelTagFilter(logging.Filter):
|
||||
"""Add leveltag"""
|
||||
|
||||
def filter(self, record: logging.LogRecord) -> bool:
|
||||
# Extract the first character of the level name
|
||||
record.leveltag = record.levelname[0]
|
||||
|
||||
# We never actually filter messages out, just abuse filtering to add an
|
||||
# extra field to the LogRecord
|
||||
# We never actually filter messages out, just add an extra field
|
||||
# to the LogRecord
|
||||
return True
|
||||
|
||||
|
||||
# Load YAML logging configuration
|
||||
with open("app/logging.yaml", "r") as f:
|
||||
config = yaml.safe_load(f)
|
||||
logging.config.dictConfig(config)
|
||||
|
||||
# Get logger
|
||||
log = logging.getLogger(Config.LOG_NAME)
|
||||
log.setLevel(logging.DEBUG)
|
||||
local_filter = LevelTagFilter()
|
||||
|
||||
# stderr
|
||||
stderr = colorlog.StreamHandler()
|
||||
stderr.setLevel(Config.LOG_LEVEL_STDERR)
|
||||
stderr.addFilter(local_filter)
|
||||
stderr_fmt = colorlog.ColoredFormatter(
|
||||
"%(log_color)s[%(asctime)s] %(filename)s:%(lineno)s %(message)s", datefmt="%H:%M:%S"
|
||||
)
|
||||
stderr.setFormatter(stderr_fmt)
|
||||
log.addHandler(stderr)
|
||||
|
||||
# syslog
|
||||
syslog = logging.handlers.SysLogHandler(address="/dev/log")
|
||||
syslog.setLevel(Config.LOG_LEVEL_SYSLOG)
|
||||
syslog.addFilter(local_filter)
|
||||
syslog_fmt = logging.Formatter(
|
||||
"[%(name)s] %(filename)s:%(lineno)s %(leveltag)s: %(message)s"
|
||||
)
|
||||
syslog.setFormatter(syslog_fmt)
|
||||
log.addHandler(syslog)
|
||||
|
||||
|
||||
def log_uncaught_exceptions(type_, value, traceback):
|
||||
|
||||
46
app/logging.yaml
Normal file
46
app/logging.yaml
Normal file
@ -0,0 +1,46 @@
|
||||
version: 1
|
||||
disable_existing_loggers: True
|
||||
|
||||
formatters:
|
||||
colored:
|
||||
(): colorlog.ColoredFormatter
|
||||
format: "%(log_color)s[%(asctime)s] %(filename)s:%(lineno)s %(message)s"
|
||||
datefmt: "%H:%M:%S"
|
||||
syslog:
|
||||
format: "[%(name)s] %(filename)s:%(lineno)s %(leveltag)s: %(message)s"
|
||||
|
||||
filters:
|
||||
leveltag:
|
||||
(): newlogger.LevelTagFilter
|
||||
category_filter:
|
||||
(): newlogger.FunctionFilter
|
||||
functions: !!set
|
||||
fb: null
|
||||
|
||||
handlers:
|
||||
stderr:
|
||||
class: colorlog.StreamHandler
|
||||
level: INFO
|
||||
formatter: colored
|
||||
filters: [leveltag]
|
||||
stream: ext://sys.stderr
|
||||
|
||||
syslog:
|
||||
class: logging.handlers.SysLogHandler
|
||||
level: DEBUG
|
||||
formatter: syslog
|
||||
filters: [leveltag]
|
||||
address: "/dev/log"
|
||||
|
||||
debug_stderr:
|
||||
class: colorlog.StreamHandler
|
||||
level: DEBUG
|
||||
formatter: colored
|
||||
filters: [leveltag, category_filter]
|
||||
stream: ext://sys.stderr
|
||||
|
||||
loggers:
|
||||
musicmuster:
|
||||
level: DEBUG
|
||||
handlers: [stderr, syslog, debug_stderr]
|
||||
propagate: false
|
||||
27
app/logging_tester.py
Executable file
27
app/logging_tester.py
Executable file
@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env python3
|
||||
from newlogger import log
|
||||
# Testing
|
||||
def fa():
|
||||
log.debug("fa Debug message")
|
||||
log.info("fa Info message")
|
||||
log.warning("fa Warning message")
|
||||
log.error("fa Error message")
|
||||
log.critical("fa Critical message")
|
||||
print()
|
||||
|
||||
|
||||
def fb():
|
||||
log.debug("fb Debug message")
|
||||
log.info("fb Info message")
|
||||
log.warning("fb Warning message")
|
||||
log.error("fb Error message")
|
||||
log.critical("fb Critical message")
|
||||
print()
|
||||
|
||||
|
||||
def testing():
|
||||
fa()
|
||||
fb()
|
||||
|
||||
|
||||
testing()
|
||||
913
poetry.lock
generated
913
poetry.lock
generated
File diff suppressed because it is too large
Load Diff
@ -3,36 +3,39 @@ name = "musicmuster"
|
||||
version = "1.7.5"
|
||||
description = "Music player for internet radio"
|
||||
authors = ["Keith Edmunds <kae@midnighthax.com>"]
|
||||
package-mode = false
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.11"
|
||||
tinytag = "^1.10.1"
|
||||
SQLAlchemy = "^2.0.36"
|
||||
SQLAlchemy = "^2.0.37"
|
||||
python-vlc = "^3.0.21203"
|
||||
mysqlclient = "^2.2.5"
|
||||
mysqlclient = "^2.2.7"
|
||||
mutagen = "^1.47.0"
|
||||
alembic = "^1.14.0"
|
||||
alembic = "^1.14.1"
|
||||
pydub = "^0.25.1"
|
||||
python-slugify = "^8.0.4"
|
||||
pyfzf = "^0.3.1"
|
||||
pydymenu = "^0.5.2"
|
||||
stackprinter = "^0.2.10"
|
||||
pyqt6 = "^6.7.1"
|
||||
pyqt6 = "^6.8.0"
|
||||
pyqtgraph = "^0.13.3"
|
||||
colorlog = "^6.9.0"
|
||||
alchemical = "^1.0.2"
|
||||
obs-websocket-py = "^1.0"
|
||||
pygame = "^2.6.1"
|
||||
psutil = "^6.1.0"
|
||||
pyqt6-webengine = "^6.7.0"
|
||||
psutil = "^6.1.1"
|
||||
pyqt6-webengine = "^6.8.0"
|
||||
fuzzywuzzy = "^0.18.0"
|
||||
python-levenshtein = "^0.26.1"
|
||||
pyyaml = "^6.0.2"
|
||||
types-pyyaml = "^6.0.12.20241230"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
ipdb = "^0.13.9"
|
||||
pytest-qt = "^4.4.0"
|
||||
pydub-stubs = "^0.25.1"
|
||||
line-profiler = "^4.1.3"
|
||||
line-profiler = "^4.2.0"
|
||||
flakehell = "^0.9.0"
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user