17
17
JsonFormatter ,
18
18
_DATETIME_FORMAT ,
19
19
_JSON_FORMAT ,
20
- _TEXT_FORMAT ,
20
+ _FRAME_TYPES ,
21
+ _DEFAULT_FRAME_TYPE ,
21
22
_get_log_format_from_str ,
22
23
)
23
24
from .lambda_runtime_marshaller import to_json
24
25
25
26
ERROR_LOG_LINE_TERMINATE = "\r "
26
27
ERROR_LOG_IDENT = "\u00a0 " # NO-BREAK SPACE U+00A0
27
- RUNTIME_ERROR_LOGGER_NAME = "system"
28
28
_AWS_LAMBDA_LOG_FORMAT = _get_log_format_from_str (
29
29
os .environ .get ("AWS_LAMBDA_LOG_FORMAT" , "TEXT" ).upper ()
30
30
)
@@ -86,14 +86,12 @@ def result(*args):
86
86
87
87
88
88
def make_error (
89
- error_message , error_type , stack_trace , invoke_id = None , level = logging .ERROR
89
+ error_message ,
90
+ error_type ,
91
+ stack_trace ,
92
+ invoke_id = None ,
90
93
):
91
94
result = {
92
- "timestamp" : time .strftime (
93
- _DATETIME_FORMAT , logging .Formatter .converter (time .time ())
94
- ),
95
- "log_level" : level ,
96
- "logger" : RUNTIME_ERROR_LOGGER_NAME ,
97
95
"errorMessage" : error_message if error_message else "" ,
98
96
"errorType" : error_type if error_type else "" ,
99
97
"requestId" : invoke_id if invoke_id is not None else "" ,
@@ -111,51 +109,48 @@ def replace_line_indentation(line, indent_char, new_indent_char):
111
109
return (new_indent_char * ident_chars_count ) + line [ident_chars_count :]
112
110
113
111
114
- def log_error_json (error_result , log_sink ):
115
- log_level = error_result .pop ("log_level" , logging .ERROR )
116
- error_result ["level" ] = logging .getLevelName (log_level )
117
- log_sink .log_error (
118
- [to_json (error_result , ensure_ascii = False )],
119
- log_level = log_level ,
120
- )
112
+ if _AWS_LAMBDA_LOG_FORMAT == _JSON_FORMAT :
113
+ def log_error (error_result , log_sink ):
114
+ error_result = {
115
+ "timestamp" : time .strftime (
116
+ _DATETIME_FORMAT , logging .Formatter .converter (time .time ())
117
+ ),
118
+ "log_level" : "ERROR" ,
119
+ ** error_result ,
120
+ }
121
+ log_sink .log_error (
122
+ [to_json (error_result )],
123
+ )
121
124
125
+ else :
126
+ def log_error (error_result , log_sink ):
127
+ error_description = "[ERROR]"
122
128
123
- def log_error_text (error_result , log_sink ):
124
- error_description = "[ERROR]"
129
+ error_result_type = error_result .get ("errorType" )
130
+ if error_result_type :
131
+ error_description += " " + error_result_type
125
132
126
- error_result_type = error_result .get ("errorType" )
127
- if error_result_type :
128
- error_description += " " + error_result_type
133
+ error_result_message = error_result .get ("errorMessage" )
134
+ if error_result_message :
135
+ if error_result_type :
136
+ error_description += ":"
137
+ error_description += " " + error_result_message
129
138
130
- error_result_message = error_result .get ("errorMessage" )
131
- if error_result_message :
132
- if error_result_type :
133
- error_description += ":"
134
- error_description += " " + error_result_message
135
-
136
- error_message_lines = [error_description ]
137
-
138
- stack_trace = error_result .get ("stackTrace" )
139
- if stack_trace is not None :
140
- error_message_lines += ["Traceback (most recent call last):" ]
141
- for trace_element in stack_trace :
142
- if trace_element == "" :
143
- error_message_lines += ["" ]
144
- else :
145
- for trace_line in trace_element .splitlines ():
146
- error_message_lines += [
147
- replace_line_indentation (trace_line , " " , ERROR_LOG_IDENT )
148
- ]
149
-
150
- log_sink .log_error (
151
- error_message_lines , log_level = error_result .get ("log_level" , logging .ERROR )
152
- )
139
+ error_message_lines = [error_description ]
153
140
141
+ stack_trace = error_result .get ("stackTrace" )
142
+ if stack_trace is not None :
143
+ error_message_lines += ["Traceback (most recent call last):" ]
144
+ for trace_element in stack_trace :
145
+ if trace_element == "" :
146
+ error_message_lines += ["" ]
147
+ else :
148
+ for trace_line in trace_element .splitlines ():
149
+ error_message_lines += [
150
+ replace_line_indentation (trace_line , " " , ERROR_LOG_IDENT )
151
+ ]
154
152
155
- if _AWS_LAMBDA_LOG_FORMAT == _JSON_FORMAT :
156
- log_error = log_error_json
157
- else :
158
- log_error = log_error_text
153
+ log_sink .log_error (error_message_lines )
159
154
160
155
161
156
def handle_event_request (
@@ -189,7 +184,10 @@ def handle_event_request(
189
184
except FaultException as e :
190
185
xray_fault = make_xray_fault ("LambdaValidationError" , e .msg , os .getcwd (), [])
191
186
error_result = make_error (
192
- e .msg , e .exception_type , e .trace , invoke_id , level = logging .FATAL
187
+ e .msg ,
188
+ e .exception_type ,
189
+ e .trace ,
190
+ invoke_id ,
193
191
)
194
192
195
193
except Exception :
@@ -262,7 +260,6 @@ def build_fault_result(exc_info, msg):
262
260
msg if msg else str (value ),
263
261
etype .__name__ ,
264
262
traceback .format_list (tb_tuples ),
265
- level = logging .FATAL ,
266
263
)
267
264
268
265
@@ -300,9 +297,7 @@ def emit(self, record):
300
297
msg = self .format (record )
301
298
302
299
self .log_sink .log (
303
- msg ,
304
- log_level = record .levelno ,
305
- log_format = getattr (record , "log_format" , _TEXT_FORMAT ),
300
+ msg , frame_type = getattr (record , "_frame_type" , _FRAME_TYPES .get (()))
306
301
)
307
302
308
303
@@ -344,29 +339,15 @@ def __enter__(self):
344
339
def __exit__ (self , exc_type , exc_value , exc_tb ):
345
340
pass
346
341
347
- def log (self , msg , log_level = None , log_format = None ):
342
+ def log (self , msg , frame_type = None ):
348
343
sys .stdout .write (msg )
349
344
350
- def log_error (self , message_lines , log_level = logging . ERROR ):
345
+ def log_error (self , message_lines ):
351
346
error_message = ERROR_LOG_LINE_TERMINATE .join (message_lines ) + "\n "
352
347
sys .stdout .write (error_message )
353
348
354
349
355
- FRAME_TYPES = {
356
- (_JSON_FORMAT , logging .NOTSET ): 0xA55A0002 .to_bytes (4 , "big" ),
357
- (_JSON_FORMAT , logging .DEBUG ): 0xA55A000A .to_bytes (4 , "big" ),
358
- (_JSON_FORMAT , logging .INFO ): 0xA55A000E .to_bytes (4 , "big" ),
359
- (_JSON_FORMAT , logging .WARNING ): 0xA55A0012 .to_bytes (4 , "big" ),
360
- (_JSON_FORMAT , logging .ERROR ): 0xA55A0016 .to_bytes (4 , "big" ),
361
- (_JSON_FORMAT , logging .CRITICAL ): 0xA55A001A .to_bytes (4 , "big" ),
362
- (_TEXT_FORMAT , logging .NOTSET ): 0xA55A0003 .to_bytes (4 , "big" ),
363
- (_TEXT_FORMAT , logging .DEBUG ): 0xA55A000B .to_bytes (4 , "big" ),
364
- (_TEXT_FORMAT , logging .INFO ): 0xA55A000F .to_bytes (4 , "big" ),
365
- (_TEXT_FORMAT , logging .WARNING ): 0xA55A0013 .to_bytes (4 , "big" ),
366
- (_TEXT_FORMAT , logging .ERROR ): 0xA55A0017 .to_bytes (4 , "big" ),
367
- (_TEXT_FORMAT , logging .CRITICAL ): 0xA55A001B .to_bytes (4 , "big" ),
368
- }
369
- DEFAULT_FRAME_TYPE = 0xA55A0003 .to_bytes (4 , "big" )
350
+ _ERROR_FRAME_TYPE = _FRAME_TYPES [(_AWS_LAMBDA_LOG_FORMAT , logging .ERROR )]
370
351
371
352
372
353
class FramedTelemetryLogSink (object ):
@@ -395,8 +376,7 @@ def __enter__(self):
395
376
def __exit__ (self , exc_type , exc_value , exc_tb ):
396
377
self .file .close ()
397
378
398
- def log (self , msg , log_level = logging .NOTSET , log_format : int = _TEXT_FORMAT ):
399
- frame_type = FRAME_TYPES .get ((log_format , log_level ), DEFAULT_FRAME_TYPE )
379
+ def log (self , msg , frame_type = _DEFAULT_FRAME_TYPE ):
400
380
encoded_msg = msg .encode ("utf8" )
401
381
402
382
timestamp = int (time .time_ns () / 1000 ) # UNIX timestamp in microseconds
@@ -408,9 +388,12 @@ def log(self, msg, log_level=logging.NOTSET, log_format: int = _TEXT_FORMAT):
408
388
)
409
389
self .file .write (log_msg )
410
390
411
- def log_error (self , message_lines , log_level = logging . ERROR ):
391
+ def log_error (self , message_lines ):
412
392
error_message = "\n " .join (message_lines )
413
- self .log (error_message , log_level = log_level )
393
+ self .log (
394
+ error_message ,
395
+ frame_type = _ERROR_FRAME_TYPE ,
396
+ )
414
397
415
398
416
399
def update_xray_env_variable (xray_trace_id ):
@@ -435,7 +418,6 @@ def create_log_sink():
435
418
436
419
437
420
def setup_logging (log_format , log_level , log_sink ):
438
- logging ._levelToName [logging .CRITICAL ] = "FATAL"
439
421
logging .Formatter .converter = time .gmtime
440
422
logger = logging .getLogger ()
441
423
logger_handler = LambdaLoggerHandler (log_sink )
0 commit comments