|
5 | 5 | import logging
|
6 | 6 | import traceback
|
7 | 7 | import json
|
| 8 | +from enum import IntEnum |
8 | 9 |
|
9 | 10 | _DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
|
10 | 11 | _RESERVED_FIELDS = {
|
|
31 | 32 | "aws_request_id",
|
32 | 33 | "_frame_type",
|
33 | 34 | }
|
34 |
| -_JSON_FORMAT = 0b0 |
35 |
| -_TEXT_FORMAT = 0b1 |
| 35 | + |
| 36 | + |
| 37 | +class LogFormat(IntEnum): |
| 38 | + JSON = 0b0 |
| 39 | + TEXT = 0b1 |
| 40 | + |
| 41 | + @classmethod |
| 42 | + def from_str(cls, value: str): |
| 43 | + if value and value.upper() == "JSON": |
| 44 | + return cls.JSON.value |
| 45 | + return cls.TEXT.value |
| 46 | + |
| 47 | + |
36 | 48 | _FRAME_TYPES = {
|
37 |
| - (_JSON_FORMAT, logging.NOTSET): 0xA55A0002.to_bytes(4, "big"), |
38 |
| - (_JSON_FORMAT, logging.DEBUG): 0xA55A000A.to_bytes(4, "big"), |
39 |
| - (_JSON_FORMAT, logging.INFO): 0xA55A000E.to_bytes(4, "big"), |
40 |
| - (_JSON_FORMAT, logging.WARNING): 0xA55A0012.to_bytes(4, "big"), |
41 |
| - (_JSON_FORMAT, logging.ERROR): 0xA55A0016.to_bytes(4, "big"), |
42 |
| - (_JSON_FORMAT, logging.CRITICAL): 0xA55A001A.to_bytes(4, "big"), |
43 |
| - (_TEXT_FORMAT, logging.NOTSET): 0xA55A0003.to_bytes(4, "big"), |
44 |
| - (_TEXT_FORMAT, logging.DEBUG): 0xA55A000B.to_bytes(4, "big"), |
45 |
| - (_TEXT_FORMAT, logging.INFO): 0xA55A000F.to_bytes(4, "big"), |
46 |
| - (_TEXT_FORMAT, logging.WARNING): 0xA55A0013.to_bytes(4, "big"), |
47 |
| - (_TEXT_FORMAT, logging.ERROR): 0xA55A0017.to_bytes(4, "big"), |
48 |
| - (_TEXT_FORMAT, logging.CRITICAL): 0xA55A001B.to_bytes(4, "big"), |
| 49 | + (LogFormat.JSON, logging.NOTSET): 0xA55A0002.to_bytes(4, "big"), |
| 50 | + (LogFormat.JSON, logging.DEBUG): 0xA55A000A.to_bytes(4, "big"), |
| 51 | + (LogFormat.JSON, logging.INFO): 0xA55A000E.to_bytes(4, "big"), |
| 52 | + (LogFormat.JSON, logging.WARNING): 0xA55A0012.to_bytes(4, "big"), |
| 53 | + (LogFormat.JSON, logging.ERROR): 0xA55A0016.to_bytes(4, "big"), |
| 54 | + (LogFormat.JSON, logging.CRITICAL): 0xA55A001A.to_bytes(4, "big"), |
| 55 | + (LogFormat.TEXT, logging.NOTSET): 0xA55A0003.to_bytes(4, "big"), |
| 56 | + (LogFormat.TEXT, logging.DEBUG): 0xA55A000B.to_bytes(4, "big"), |
| 57 | + (LogFormat.TEXT, logging.INFO): 0xA55A000F.to_bytes(4, "big"), |
| 58 | + (LogFormat.TEXT, logging.WARNING): 0xA55A0013.to_bytes(4, "big"), |
| 59 | + (LogFormat.TEXT, logging.ERROR): 0xA55A0017.to_bytes(4, "big"), |
| 60 | + (LogFormat.TEXT, logging.CRITICAL): 0xA55A001B.to_bytes(4, "big"), |
49 | 61 | }
|
50 |
| -_DEFAULT_FRAME_TYPE = _FRAME_TYPES[(_TEXT_FORMAT, logging.NOTSET)] |
| 62 | +_DEFAULT_FRAME_TYPE = _FRAME_TYPES[(LogFormat.TEXT, logging.NOTSET)] |
51 | 63 |
|
52 | 64 |
|
53 | 65 | _encode_json = json.JSONEncoder(ensure_ascii=False).encode
|
54 | 66 |
|
55 | 67 |
|
56 |
| -def _get_log_format_from_str(value: str): |
57 |
| - if value == "JSON": |
58 |
| - return _JSON_FORMAT |
59 |
| - return _TEXT_FORMAT |
60 |
| - |
61 |
| - |
62 | 68 | class JsonFormatter(logging.Formatter):
|
63 | 69 | def __init__(self):
|
64 | 70 | super().__init__(datefmt=_DATETIME_FORMAT)
|
@@ -98,8 +104,8 @@ def format_log_level(record: logging.LogRecord):
|
98 | 104 | def format(self, record: logging.LogRecord) -> str:
|
99 | 105 | self.format_log_level(record)
|
100 | 106 | record._frame_type = _FRAME_TYPES.get(
|
101 |
| - (_JSON_FORMAT, record.levelno), |
102 |
| - _FRAME_TYPES[(_JSON_FORMAT, logging.NOTSET)], |
| 107 | + (LogFormat.JSON, record.levelno), |
| 108 | + _FRAME_TYPES[(LogFormat.JSON, logging.NOTSET)], |
103 | 109 | )
|
104 | 110 |
|
105 | 111 | result = {
|
|
0 commit comments