Does the python-json-logger support unhandled exceptions? I can see from the docs that catching an error and logging the error using exc_info works well, but what about in cases where the error isn't caught please?
Here is what I am seeing when the boto3 client throws an exception that isn't caught/handled, the traceback lines are seen as completely separate log messages:
{"asctime": "2019-08-29 08:02:29,276", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": "Traceback (most recent call last):"}
{"asctime": "2019-08-29 08:02:29,277", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/usr/local/lib/python3.7/runpy.py\", line 193, in _run_module_as_main"}
{"asctime": "2019-08-29 08:02:29,277", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " \"__main__\", mod_spec)"}
{"asctime": "2019-08-29 08:02:29,277", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/usr/local/lib/python3.7/runpy.py\", line 85, in _run_code"}
{"asctime": "2019-08-29 08:02:29,277", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " exec(code, run_globals)"}
{"asctime": "2019-08-29 08:02:29,277", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/scripts/cme/irs_to_s3.py\", line 34, in <module>"}
{"asctime": "2019-08-29 08:02:29,277", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " bucket_files = [el.key for el in s3_bucket.objects.all()]"}
{"asctime": "2019-08-29 08:02:29,278", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/scripts/cme/irs_to_s3.py\", line 34, in <listcomp>"}
{"asctime": "2019-08-29 08:02:29,278", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " bucket_files = [el.key for el in s3_bucket.objects.all()]"}
{"asctime": "2019-08-29 08:02:29,278", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/boto3/resources/collection.py\", line 83, in __iter__"}
{"asctime": "2019-08-29 08:02:29,278", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " for page in self.pages():"}
{"asctime": "2019-08-29 08:02:29,278", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/boto3/resources/collection.py\", line 166, in pages"}
{"asctime": "2019-08-29 08:02:29,278", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " for page in pages:"}
{"asctime": "2019-08-29 08:02:29,278", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/paginate.py\", line 255, in __iter__"}
{"asctime": "2019-08-29 08:02:29,278", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " response = self._make_request(current_kwargs)"}
{"asctime": "2019-08-29 08:02:29,279", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/paginate.py\", line 332, in _make_request"}
{"asctime": "2019-08-29 08:02:29,279", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " return self._method(**current_kwargs)"}
{"asctime": "2019-08-29 08:02:29,279", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/client.py\", line 357, in _api_call"}
{"asctime": "2019-08-29 08:02:29,279", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " return self._make_api_call(operation_name, kwargs)"}
{"asctime": "2019-08-29 08:02:29,279", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/client.py\", line 648, in _make_api_call"}
{"asctime": "2019-08-29 08:02:29,279", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " operation_model, request_dict, request_context)"}
{"asctime": "2019-08-29 08:02:29,279", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/client.py\", line 667, in _make_request"}
{"asctime": "2019-08-29 08:02:29,280", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " return self._endpoint.make_request(operation_model, request_dict)"}
{"asctime": "2019-08-29 08:02:29,280", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/endpoint.py\", line 102, in make_request"}
{"asctime": "2019-08-29 08:02:29,280", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " return self._send_request(request_dict, operation_model)"}
{"asctime": "2019-08-29 08:02:29,280", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/endpoint.py\", line 132, in _send_request"}
{"asctime": "2019-08-29 08:02:29,280", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " request = self.create_request(request_dict, operation_model)"}
{"asctime": "2019-08-29 08:02:29,280", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/endpoint.py\", line 116, in create_request"}
{"asctime": "2019-08-29 08:02:29,280", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " operation_name=operation_model.name)"}
{"asctime": "2019-08-29 08:02:29,280", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/hooks.py\", line 356, in emit"}
{"asctime": "2019-08-29 08:02:29,281", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " return self._emitter.emit(aliased_event_name, **kwargs)"}
{"asctime": "2019-08-29 08:02:29,281", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/hooks.py\", line 228, in emit"}
{"asctime": "2019-08-29 08:02:29,281", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " return self._emit(event_name, kwargs)"}
{"asctime": "2019-08-29 08:02:29,281", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/hooks.py\", line 211, in _emit"}
{"asctime": "2019-08-29 08:02:29,281", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " response = handler(**kwargs)"}
{"asctime": "2019-08-29 08:02:29,281", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/signers.py\", line 90, in handler"}
{"asctime": "2019-08-29 08:02:29,281", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " return self.sign(operation_name, request)"}
{"asctime": "2019-08-29 08:02:29,282", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/signers.py\", line 157, in sign"}
{"asctime": "2019-08-29 08:02:29,282", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " auth.add_auth(request)"}
{"asctime": "2019-08-29 08:02:29,282", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/auth.py\", line 425, in add_auth"}
{"asctime": "2019-08-29 08:02:29,285", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " super(S3SigV4Auth, self).add_auth(request)"}
{"asctime": "2019-08-29 08:02:29,285", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " File \"/home/airflow/airflow/venv_lite_py3/lib/python3.7/site-packages/botocore/auth.py\", line 357, in add_auth"}
{"asctime": "2019-08-29 08:02:29,285", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": " raise NoCredentialsError"}
{"asctime": "2019-08-29 08:02:29,285", "filename": "bash_operator.py", "lineno": 128, "levelname": "INFO", "message": "botocore.exceptions.NoCredentialsError: Unable to locate credentials"}
{"asctime": "2019-08-29 08:02:29,374", "filename": "bash_operator.py", "lineno": 132, "levelname": "INFO", "message": "Command exited with return code 1"}
Happy to try and work through a PR. But just wanted to clarify the traceback support.