-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlogger.py
More file actions
130 lines (105 loc) Β· 4.9 KB
/
logger.py
File metadata and controls
130 lines (105 loc) Β· 4.9 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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
"""Custom logger and error notifications."""
import json
import re
from sys import stdout
from loguru import logger
def json_formatter(record: dict) -> str:
"""
Format info message logs.
:param dict record: Log object containing log metadata & message.
:returns: str
"""
record["time"] = record["time"].strftime("%m/%d/%Y, %H:%M:%S")
record["elapsed"] = record["elapsed"].total_seconds()
def serialize_as_admin(log: dict) -> str:
"""
Construct JSON info log record where user is room admin.
:param dict log: Dictionary containing logged message with metadata.
:returns: str
"""
try:
chat_data = re.search(r"(?P<room>\[\S+]) (?P<user>\[\S+]) (?P<ip>\[\S+])", log.get("message"))
if chat_data and log.get("message"):
subset = {
"time": log["time"],
"message": log["message"].split(": ", 1)[1],
"level": log["level"].name,
"room": chat_data["room"].replace("[", "").replace("]", ""),
"user": chat_data["user"].replace("[", "").replace("]", ""),
"ip": chat_data["ip"].replace("[", "").replace("]", ""),
}
return json.dumps(subset)
except Exception as e:
subset["error"] = f"Logging error occurred: {str(e)}"
return serialize_error(subset)
def serialize_event(log: dict) -> str:
"""
Construct warning log.
:param dict log: Dictionary containing logged message with metadata.
:returns: str
"""
try:
chat_data = re.search(r"(?P<room>\[\S+]) (?P<user>\[\S+])", log["message"])
if bool(chat_data) and log.get("message") is not None:
subset = {
"time": log["time"],
"message": log["message"].split(": ", 1)[1],
"level": log["level"].name,
"room": chat_data["room"].replace("[", "").replace("]", ""),
"user": chat_data["user"].replace("[", "").replace("]", ""),
}
return json.dumps(subset)
except Exception as e:
log["error"] = f"Logging error occurred: {str(e)}"
def serialize_error(log: dict) -> str:
"""
Construct error log record.
:param dict log: Dictionary containing logged message with metadata.
:returns: str
"""
if log and log.get("message"):
subset = {
"time": log["time"],
"level": log["level"].name,
"message": log["message"],
}
return json.dumps(subset)
if record["level"].name == "INFO":
record["extra"]["serialized"] = serialize_as_admin(record)
return "{extra[serialized]},\n"
if record["level"].name in ("TRACE", "WARNING", "SUCCESS", "DEBUG"):
record["extra"]["serialized"] = serialize_event(record)
return "{extra[serialized]},\n"
if record["level"].name in ("ERROR", "CRITICAL"):
record["extra"]["serialized"] = serialize_error(record)
return "{extra[serialized]},\n"
record["extra"]["serialized"] = serialize_error(record)
return "{extra[serialized]},\n"
def log_formatter(record: dict) -> str:
"""
Formatter for .log records
:param dict record: Key/value object containing log message & metadata.
:returns: str
"""
if record["level"].name == "TRACE":
return "<fg #5278a3>{time:MM-DD-YYYY HH:mm:ss}</fg #5278a3> | <fg #d2eaff>{level}</fg #d2eaff>: <light-white>{message}</light-white>\n"
if record["level"].name == "INFO":
return "<fg #5278a3>{time:MM-DD-YYYY HH:mm:ss}</fg #5278a3> | <fg #98bedf>{level}</fg #98bedf>: <light-white>{message}</light-white>\n"
if record["level"].name == "WARNING":
return "<fg #5278a3>{time:MM-DD-YYYY HH:mm:ss}</fg #5278a3> | <fg #b09057>{level}</fg #b09057>: <light-white>{message}</light-white>\n"
if record["level"].name == "SUCCESS":
return "<fg #5278a3>{time:MM-DD-YYYY HH:mm:ss}</fg #5278a3> | <fg #6dac77>{level}</fg #6dac77>: <light-white>{message}</light-white>\n"
if record["level"].name == "ERROR":
return "<fg #5278a3>{time:MM-DD-YYYY HH:mm:ss}</fg #5278a3> | <fg #a35252>{level}</fg #a35252>: <light-white>{message}</light-white>\n"
if record["level"].name == "CRITICAL":
return "<fg #5278a3>{time:MM-DD-YYYY HH:mm:ss}</fg #5278a3> | <fg #521010>{level}</fg #521010>: <light-white>{message}</light-white>\n"
return "<fg #5278a3>{time:MM-DD-YYYY HH:mm:ss}</fg #5278a3> | <fg #98bedf>{level}</fg #98bedf>: <light-white>{message}</light-white>\n"
def create_logger() -> logger:
"""
Configure custom logger.
:returns: logger
"""
logger.remove()
logger.add(stdout, level="TRACE", colorize=True, catch=True, format=log_formatter)
return logger
LOGGER = create_logger()