-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathlogger.py
99 lines (80 loc) · 3.06 KB
/
logger.py
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
"""Custom logger."""
import json
from os import path
from sys import stdout
from loguru import logger
from config import BASE_DIR, PERSIST_LOG_FILES
def json_formatter(record: dict) -> str:
"""
Pass raw log to be serialized.
:param dict record: Dictionary containing logged message with metadata.
:returns: str
"""
def serialize(log: dict) -> str:
"""
Parse log message into Datadog JSON format.
:param dict log: Dictionary containing logged message with metadata.
:returns: str
"""
subset = {
"time": log["time"].strftime("%m/%d/%Y, %H:%M:%S"),
"message": log["message"],
"level": log["level"].name,
"function": log.get("function"),
"module": log.get("name"),
}
if log.get("exception", None):
subset.update({"exception": log["exception"]})
return json.dumps(subset)
record["extra"]["serialized"] = serialize(record)
return "{extra[serialized]},\n"
def log_formatter(record: dict) -> str:
"""
Formatter for .log records
:param dict record: Key/value object containing a single log's message & metadata.
:returns: str
"""
if record["level"].name == "TRACE":
return "<fg #5278a3>{time:MM-DD-YYYY HH:mm:ss}</fg #5278a3> | <fg #cfe2f3>{level}</fg #cfe2f3>: <light-white>{message}</light-white>\n"
elif record["level"].name == "INFO":
return "<fg #5278a3>{time:MM-DD-YYYY HH:mm:ss}</fg #5278a3> | <fg #b3cfe7>{level}</fg #b3cfe7>: <light-white>{message}</light-white>\n"
elif 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"
elif 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"
elif 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"
return "<fg #5278a3>{time:MM-DD-YYYY HH:mm:ss}</fg #5278a3> | <fg #b3cfe7>{level}</fg #b3cfe7>: <light-white>{message}</light-white>\n"
def create_logger() -> logger:
"""
Configure custom logger.
:returns: logger
"""
logger.remove()
logger.add(
stdout,
colorize=True,
catch=True,
format=log_formatter,
)
if PERSIST_LOG_FILES == "production" and path.isdir(f"{BASE_DIR}/log/"):
logger.add(
f"{BASE_DIR}/log/info.log",
colorize=True,
catch=True,
format=log_formatter,
rotation="300 MB",
compression="zip",
)
logger.add(
f"{BASE_DIR}/logs/error.log",
colorize=True,
catch=True,
format=log_formatter,
rotation="300 MB",
compression="zip",
level="ERROR",
)
return logger
# Custom logger
LOGGER = create_logger()