Goal: easily generate structured JSON logging. logstash mode is optional.
import logging
import logjson
logger = logging.getLogger('blah')
handler = logging.StreamHandler()
handler.setFormatter(
logjson.JSONFormatter(pretty=True)
)
logger.addHandler(handler)
logger.info('hi %s %s!', 'you', 'there')
Output:
{
"name": "blah",
"msg": "hi %s %s!",
"args": [
"you",
"there"
],
"levelname": "INFO",
"levelno": 20,
"pathname": "<snip>",
"filename": "test_main.py",
"module": "test_main",
"exc_text": null,
"stack_info": null,
"lineno": 17,
"funcName": "test_main",
"created": 1511750128.6285746,
"msecs": 628.5746097564697,
"relativeCreated": 23.08201789855957,
"thread": 139929130264384,
"threadName": "MainThread",
"processName": "MainProcess",
"process": 18460,
"message": "hi you there!",
"created_iso": "2017-11-27T02:35:28.628575+00:00"
}
Logstash mode is only one param away:
logger = logging.getLogger('ls')
handler = logging.StreamHandler()
handler.setFormatter(
logjson.JSONFormatter(pretty=True, logstash_mode=True)
)
logger.addHandler(handler)
logger.info('logstash test')
Output:
{
"@message": "logstash test",
"@source_host": "localhost.localdomain",
"@timestamp": "2017-11-27T02:35:28.631275+00:00",
"@fields": {
"name": "ls",
"msg": "logstash test",
"args": [],
"levelname": "INFO",
"levelno": 20,
"pathname": "<snip>",
"filename": "test_main.py",
"module": "test_main",
"exc_text": null,
"stack_info": null,
"lineno": 42,
"funcName": "test_logstash",
"created": 1511750128.631275,
"msecs": 631.274938583374,
"relativeCreated": 25.782346725463867,
"thread": 139929130264384,
"threadName": "MainThread",
"processName": "MainProcess",
"process": 18460
}
}