Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Udayraj123
GitHub Repository: Udayraj123/OMRChecker
Path: blob/master/src/logger.py
214 views
1
import logging
2
from typing import Union
3
4
from rich.console import Console
5
from rich.logging import RichHandler
6
7
FORMAT = "%(message)s"
8
9
# TODO: set logging level from config.json dynamically
10
logging.basicConfig(
11
level=logging.INFO,
12
format="%(message)s",
13
datefmt="[%X]",
14
handlers=[RichHandler(rich_tracebacks=True)],
15
)
16
17
18
class Logger:
19
def __init__(
20
self,
21
name,
22
level: Union[int, str] = logging.NOTSET,
23
message_format="%(message)s",
24
date_format="[%X]",
25
):
26
self.log = logging.getLogger(name)
27
self.log.setLevel(level)
28
self.log.__format__ = message_format
29
self.log.__date_format__ = date_format
30
31
def debug(self, *msg: object, sep=" ", end="\n") -> None:
32
return self.logutil("debug", *msg, sep=sep)
33
34
def info(self, *msg: object, sep=" ", end="\n") -> None:
35
return self.logutil("info", *msg, sep=sep)
36
37
def warning(self, *msg: object, sep=" ", end="\n") -> None:
38
return self.logutil("warning", *msg, sep=sep)
39
40
def error(self, *msg: object, sep=" ", end="\n") -> None:
41
return self.logutil("error", *msg, sep=sep)
42
43
def critical(self, *msg: object, sep=" ", end="\n") -> None:
44
return self.logutil("critical", *msg, sep=sep)
45
46
def stringify(func):
47
def inner(self, method_type: str, *msg: object, sep=" "):
48
nmsg = []
49
for v in msg:
50
if not isinstance(v, str):
51
v = str(v)
52
nmsg.append(v)
53
return func(self, method_type, *nmsg, sep=sep)
54
55
return inner
56
57
# set stack level to 3 so that the caller of this function is logged, not this function itself.
58
# stack-frame - self.log.debug - logutil - stringify - log method - caller
59
@stringify
60
def logutil(self, method_type: str, *msg: object, sep=" ") -> None:
61
func = getattr(self.log, method_type, None)
62
if not func:
63
raise AttributeError(f"Logger has no method {method_type}")
64
return func(sep.join(msg), stacklevel=4)
65
66
67
logger = Logger(__name__)
68
console = Console()
69
70