-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathlogger.py
More file actions
66 lines (53 loc) · 2.02 KB
/
logger.py
File metadata and controls
66 lines (53 loc) · 2.02 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
import json
import logging
import traceback
from datetime import datetime
from typing import Optional
from common import env
class DatetimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S.%f")
return super().default(obj)
class CustomFormatter(logging.Formatter):
def format(self, record: logging.LogRecord) -> str:
source = ":".join([record.filename, str(record.lineno)])
if isinstance(record.msg, dict):
if "_source" in record.msg: # override call stack
source = record.msg["_source"]
message = {k: v for k, v in record.msg.items() if k not in ["_source"]}
else:
message = record.msg
else:
message = record.getMessage()
log = {
"name": record.name,
"level": record.levelname,
"source": source,
"create_time": datetime.fromtimestamp(record.created),
"message": message,
}
if record.exc_info:
log["traceback"] = self.formatException(record.exc_info)
str_log = json.dumps(
log, ensure_ascii=False, separators=(",", ":"), cls=DatetimeEncoder
)
if (length := len(str_log)) > 65535:
log = {
"error": "logging entity too long",
"length": length,
"traceback": "".join(traceback.format_list(traceback.extract_stack())),
}
str_log = json.dumps(log)
if env.is_local() and "traceback" in log: # 方便本地 DEBUG
str_log += "\n" + log["traceback"]
return str_log
logger = logging.getLogger("wizard")
formatter = CustomFormatter()
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO if env.is_prod() else logging.DEBUG)
def get_logger(name: Optional[str]) -> logging.Logger:
return logger.getChild(name)
__all__ = ["get_logger"]