Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django How can I log client ip address?

I save the logs to the file with this configuration. But I could not log the client ip address.

I also want to keep logs for 1 day.

Is there a simple method for this? Does anyone have an idea about this?

django-requestlogging

I tried this library but failed. I do not know if it is up to date. Thanks

 LOGGING ={
'version':1,
'loggers':{
    'django':{
        'handlers':['file','file2'],
        'level':'DEBUG'
    }
},
'handlers':{
    'file':{
        'level':'INFO',
        'class': 'logging.FileHandler',
        'filename':'./logs/info.log',
        'formatter':'simpleRe',
    },
    'file2':{
        'level':'DEBUG',
        'class': 'logging.FileHandler',
        'filename':'./logs/debug6.log',
        'formatter':'simpleRe',
    }
},
'formatters':{
    'simpleRe': {
        'format': ' {asctime} {levelname} {message} ',
        'style': '{',
    }

} }
like image 569
Birol Emekli Avatar asked Oct 23 '25 14:10

Birol Emekli


1 Answers

You could use 2 options:

  1. Add the client's ip to each log text message. It works if your code has a request object.

import logging

def foo(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = request.META.get('REMOTE_ADDR')
        
    some_logger = logging.getLogger(__name__)
    some_logger.warning('Your log message... IP:' + ip)

  1. Use the django.request or django.server extensions and their extra context feature. So the log section in settings.py might look like this:
import logging

class IPAddressFilter(logging.Filter):

    def filter(self, record):
        if hasattr(record, 'request'):
            x_forwarded_for = record.request.META.get('HTTP_X_FORWARDED_FOR')
            if x_forwarded_for:
                record.ip = x_forwarded_for.split(',')[0]
            else:
                record.ip = record.request.META.get('REMOTE_ADDR')
        return True


LOGGING = {
    "version": 1,
    "formatters": {
        "request_formatter": {
            "format": "%(asctime)s  - %(name)s - %(ip)s - %(levelname)s -  %(message)s",
            "datefmt": "%Y-%m-%d %H:%M:%S"
        },
    },
    "handlers": {
        "request": {
            "level": "WARNING",
            "class": "logging.handlers.RotatingFileHandler",
            "formatter": "request_formatter",
            "filename": "requests.txt",
            "maxBytes": 1024000,
            "backupCount": 3
        }
    },
    'filters': {
        'add_ip_address': {
            '()': 'settings.IPAddressFilter' # You can move IPAddressFilter class from settings.py to another location (e.g., apps.other.filters.IPAddressFilter)
        }
    },
    "loggers": {
        'django.request': {
            "level": "WARNING",
            'filters': ['add_ip_address'],
             "handlers": ["request"]
        },
    },
    "disable_existing_loggers": False
}

like image 58
Ivan Avatar answered Oct 26 '25 04:10

Ivan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!