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')