Skip to content

Instantly share code, notes, and snippets.

@kdgregory
Last active March 1, 2022 11:39
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Embed
What would you like to do?
Example of generating JSON logging output from Python
import json
import logging
import platform
import sys
import time
import traceback
class JSONFormatter:
"""A formatter for the standard logging module that converts a LogRecord into JSON
Output matches JSONLayout from https://github.com/kdgregory/log4j-aws-appenders. Any
keyword arguments supplied to the constructor are output in a "tags" sub-object.
"""
def __init__(self, **tags):
self.tags = tags
def format(self, record):
result = {
'timestamp': time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime(record.created)) +
(".%03dZ" % (1000 * (record.created % 1))),
'level': record.levelname,
'logger': record.name,
'message': record.msg % record.args,
'hostname': platform.node(),
'processId': record.process,
'thread': record.threadName,
'locationInfo': {
'fileName': record.filename,
'lineNumber': record.lineno
}
}
if self.tags:
result['tags'] = self.tags
if (record.exc_info):
result['exception'] = traceback.format_exception(record.exc_info[0], record.exc_info[1], record.exc_info[2])
return json.dumps(result)
def configure_logging():
handler = logging.StreamHandler(sys.stderr)
handler.setFormatter(JSONFormatter(application="example"))
logging.basicConfig(level=logging.DEBUG, handlers=[handler])
if __name__ == '__main__':
configure_logging()
logger = logging.getLogger(__name__)
logger.info('Started')
logger.debug('this is a test of %s %s', "value", "substitutions")
try:
raise Exception("example")
except Exception as ex:
logger.exception("caught exception")
logger.info('Finished')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment