django
django + json-log-formatter
pyman
2019. 11. 26. 13:24
django 로그 포맷을 json 으로 변경한다
vi project/settings.py
import json_log_formatter
class CustomisedJSONFormatter(json_log_formatter.JSONFormatter):
def json_record(self, message, extra, record):
extra['message'] = message
extra['levelname'] = record.__dict__['levelname']
extra['name'] = record.__dict__['name']
extra['lineno'] = record.__dict__['lineno']
extra['filename'] = record.__dict__['filename']
extra['pathname'] = record.__dict__['pathname']
extra['created'] = record.__dict__['created']
request = extra.pop('request', None)
if request:
extra['x_forward_for'] = request.META.get('X-FORWARD-FOR')
return extra
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format' : "[%(asctime)s] %(levelname)s %(name)s:%(lineno)s %(message)s",
'datefmt' : "%Y-%m-%d %H:%M:%S"
},
'json': {
'()': CustomisedJSONFormatter,
}
},
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'standard',
},
'log_file1': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': os.path.join(LOG_DIR, 'log_file1.log'),
'formatter': 'standard',
},
'log_file2': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': os.path.join(LOG_DIR, 'log_file2.log'),
'formatter': 'json',
},
},
'loggers': {
'log_file1': {
'handlers': ['log_file1'],
'level': 'INFO',
'propagate': False,
},
'log_file2': {
'handlers': ['log_file2'],
'level': 'INFO',
'propagate': False,
}
}
}
''' view 에서 request 로깅 '''
logger = logging.getLogger('log_file2')
logger.info('test', extra={'request': request})
cat log_file1.log
{"message": "list", "levelname": "INFO", "name": "project", "lineno": 38, "filename": "project.py", "pathname": "./snippet/views.py", "created": 1574735677.8157334, "x_forward_for": "192.168.0.2"}
''' django shell 에서 로깅 '''
python manager.py shell
import logging
logger = logging.getLogger('log_file2')
logger.info('test')