-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlogger.py
More file actions
74 lines (58 loc) · 1.99 KB
/
logger.py
File metadata and controls
74 lines (58 loc) · 1.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import logging
import sys
import structlog
__all__ = ["structlog", "configure_logging"]
def custom_renderer(
_logger: structlog.types.WrappedLogger,
_method_name: str,
event_dict: structlog.types.EventDict,
) -> str:
timestamp = event_dict.pop("timestamp", "")
level = event_dict.pop("level", "info").upper()
event = event_dict.pop("event", "")
level_colors = {
"DEBUG": "\033[36m", # Cyan
"INFO": "\033[32m", # Green
"WARNING": "\033[33m", # Yellow
"ERROR": "\033[31m", # Red
"CRITICAL": "\033[35m", # Magenta
}
reset = "\033[0m"
gray = "\033[90m"
color = level_colors.get(level, reset)
extras = " ".join(f"{k}={v}" for k, v in event_dict.items())
extra_str = f" {extras}" if extras else ""
return f"{gray}{timestamp}{reset} {color}{level:8}{reset} {event}{extra_str}"
_shared_processors: list[structlog.types.Processor] = [
structlog.stdlib.add_log_level,
structlog.dev.set_exc_info,
structlog.processors.TimeStamper(fmt="iso", utc=True),
structlog.contextvars.merge_contextvars,
structlog.processors.StackInfoRenderer(),
]
def configure_logging() -> None:
structlog.configure(
processors=[
*_shared_processors,
custom_renderer,
],
context_class=dict,
logger_factory=structlog.PrintLoggerFactory(file=sys.stderr),
cache_logger_on_first_use=True,
)
formatter = structlog.stdlib.ProcessorFormatter(
foreign_pre_chain=_shared_processors,
processors=[
structlog.stdlib.ProcessorFormatter.remove_processors_meta,
custom_renderer,
],
)
handler = logging.StreamHandler(sys.stderr)
handler.setFormatter(formatter)
root = logging.getLogger()
root.handlers = [handler]
root.setLevel(logging.INFO)
for name in ("uvicorn", "uvicorn.error", "uvicorn.access"):
log = logging.getLogger(name)
log.handlers = []
log.propagate = True