Skip to content

Commit 3c98bb4

Browse files
author
Artem Krivonos
committed
Add log level into binary messages for TEXT format
1 parent 7fd2fab commit 3c98bb4

File tree

3 files changed

+29
-15
lines changed

3 files changed

+29
-15
lines changed

awslambdaric/bootstrap.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
_DATETIME_FORMAT,
1818
_DEFAULT_FRAME_TYPE,
1919
_JSON_FRAME_TYPES,
20+
_TEXT_FRAME_TYPES,
2021
JsonFormatter,
2122
LogFormat,
23+
_format_log_level,
2224
_get_log_level_from_env_var,
2325
)
2426
from .lambda_runtime_marshaller import to_json
@@ -125,7 +127,7 @@ def log_error(error_result, log_sink):
125127
)
126128

127129
else:
128-
_ERROR_FRAME_TYPE = _DEFAULT_FRAME_TYPE
130+
_ERROR_FRAME_TYPE = _TEXT_FRAME_TYPES[logging.ERROR]
129131

130132
def log_error(error_result, log_sink):
131133
error_description = "[ERROR]"
@@ -298,9 +300,13 @@ def __init__(self, log_sink):
298300
self.log_sink = log_sink
299301

300302
def emit(self, record):
301-
msg = self.format(record)
302-
303-
self.log_sink.log(msg, frame_type=getattr(record, "_frame_type", None))
303+
self.log_sink.log(
304+
self.format(record),
305+
frame_type=(
306+
getattr(record, "_frame_type", None)
307+
or _TEXT_FRAME_TYPES.get(_format_log_level(record))
308+
),
309+
)
304310

305311

306312
class LambdaLoggerFilter(logging.Filter):

awslambdaric/lambda_runtime_log_utils.py

+15-7
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,24 @@ def _get_log_level_from_env_var(log_level):
5757
logging.ERROR: 0xA55A0016.to_bytes(4, "big"),
5858
logging.CRITICAL: 0xA55A001A.to_bytes(4, "big"),
5959
}
60-
_DEFAULT_FRAME_TYPE = 0xA55A0003.to_bytes(4, "big")
60+
_TEXT_FRAME_TYPES = {
61+
logging.NOTSET: 0xA55A0003.to_bytes(4, "big"),
62+
logging.DEBUG: 0xA55A000B.to_bytes(4, "big"),
63+
logging.INFO: 0xA55A000F.to_bytes(4, "big"),
64+
logging.WARNING: 0xA55A0013.to_bytes(4, "big"),
65+
logging.ERROR: 0xA55A0017.to_bytes(4, "big"),
66+
logging.CRITICAL: 0xA55A001B.to_bytes(4, "big"),
67+
}
68+
_DEFAULT_FRAME_TYPE = _TEXT_FRAME_TYPES[logging.NOTSET]
6169

6270
_json_encoder = json.JSONEncoder(ensure_ascii=False)
6371
_encode_json = _json_encoder.encode
6472

6573

74+
def _format_log_level(record: logging.LogRecord):
75+
return min(50, max(0, record.levelno)) // 10 * 10
76+
77+
6678
class JsonFormatter(logging.Formatter):
6779
def __init__(self):
6880
super().__init__(datefmt=_DATETIME_FORMAT)
@@ -94,13 +106,9 @@ def __format_location(record: logging.LogRecord):
94106

95107
return f"{record.pathname}:{record.funcName}:{record.lineno}"
96108

97-
@staticmethod
98-
def __format_log_level(record: logging.LogRecord):
99-
record.levelno = min(50, max(0, record.levelno)) // 10 * 10
100-
record.levelname = logging.getLevelName(record.levelno)
101-
102109
def format(self, record: logging.LogRecord) -> str:
103-
self.__format_log_level(record)
110+
record.levelno = _format_log_level(record)
111+
record.levelname = logging.getLevelName(record.levelno)
104112
record._frame_type = _JSON_FRAME_TYPES.get(
105113
record.levelno, _JSON_FRAME_TYPES[logging.NOTSET]
106114
)

tests/test_bootstrap.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -927,7 +927,7 @@ def test_log_error_framed_log_sink(self):
927927
content = f.read()
928928

929929
frame_type = int.from_bytes(content[:4], "big")
930-
self.assertEqual(frame_type, 0xA55A0003)
930+
self.assertEqual(frame_type, 0xA55A0017)
931931

932932
length = int.from_bytes(content[4:8], "big")
933933
self.assertEqual(length, len(expected_logged_error.encode("utf8")))
@@ -973,7 +973,7 @@ def test_log_error_indentation_framed_log_sink(self):
973973
content = f.read()
974974

975975
frame_type = int.from_bytes(content[:4], "big")
976-
self.assertEqual(frame_type, 0xA55A0003)
976+
self.assertEqual(frame_type, 0xA55A0017)
977977

978978
length = int.from_bytes(content[4:8], "big")
979979
self.assertEqual(length, len(expected_logged_error.encode("utf8")))
@@ -1016,7 +1016,7 @@ def test_log_error_empty_stacktrace_line_framed_log_sink(self):
10161016
content = f.read()
10171017

10181018
frame_type = int.from_bytes(content[:4], "big")
1019-
self.assertEqual(frame_type, 0xA55A0003)
1019+
self.assertEqual(frame_type, 0xA55A0017)
10201020

10211021
length = int.from_bytes(content[4:8], "big")
10221022
self.assertEqual(length, len(expected_logged_error))
@@ -1053,7 +1053,7 @@ def test_log_error_invokeId_line_framed_log_sink(self):
10531053
content = f.read()
10541054

10551055
frame_type = int.from_bytes(content[:4], "big")
1056-
self.assertEqual(frame_type, 0xA55A0003)
1056+
self.assertEqual(frame_type, 0xA55A0017)
10571057

10581058
length = int.from_bytes(content[4:8], "big")
10591059
self.assertEqual(length, len(expected_logged_error))

0 commit comments

Comments
 (0)