2👍
You could use 2 options:
- 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)
- 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
}
👤Ivan
0👍
You could use filters or adapters as described in the logging cookbook. The filter example is:
import logging
from random import choice
class ContextFilter(logging.Filter):
"""
This is a filter which injects contextual information into the log.
Rather than use actual contextual information, we just use random
data in this demo.
"""
USERS = ['jim', 'fred', 'sheila']
IPS = ['123.231.231.123', '127.0.0.1', '192.168.0.1']
def filter(self, record):
record.ip = choice(ContextFilter.IPS)
record.user = choice(ContextFilter.USERS)
return True
if __name__ == '__main__':
levels = (logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s')
a1 = logging.getLogger('a.b.c')
a2 = logging.getLogger('d.e.f')
f = ContextFilter()
a1.addFilter(f)
a2.addFilter(f)
a1.debug('A debug message')
a1.info('An info message with %s', 'some parameters')
for x in range(10):
lvl = choice(levels)
lvlname = logging.getLevelName(lvl)
a2.log(lvl, 'A message at %s level with %d %s', lvlname, 2, 'parameters')
When run, this prints output like
2010-09-06 22:38:15,292 a.b.c DEBUG IP: 123.231.231.123 User: fred A debug message
2010-09-06 22:38:15,300 a.b.c INFO IP: 192.168.0.1 User: sheila An info message with some parameters
2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1 User: sheila A message at CRITICAL level with 2 parameters
2010-09-06 22:38:15,300 d.e.f ERROR IP: 127.0.0.1 User: jim A message at ERROR level with 2 parameters
2010-09-06 22:38:15,300 d.e.f DEBUG IP: 127.0.0.1 User: sheila A message at DEBUG level with 2 parameters
2010-09-06 22:38:15,300 d.e.f ERROR IP: 123.231.231.123 User: fred A message at ERROR level with 2 parameters
2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 192.168.0.1 User: jim A message at CRITICAL level with 2 parameters
2010-09-06 22:38:15,300 d.e.f CRITICAL IP: 127.0.0.1 User: sheila A message at CRITICAL level with 2 parameters
2010-09-06 22:38:15,300 d.e.f DEBUG IP: 192.168.0.1 User: jim A message at DEBUG level with 2 parameters
2010-09-06 22:38:15,301 d.e.f ERROR IP: 127.0.0.1 User: sheila A message at ERROR level with 2 parameters
2010-09-06 22:38:15,301 d.e.f DEBUG IP: 123.231.231.123 User: fred A message at DEBUG level with 2 parameters
2010-09-06 22:38:15,301 d.e.f INFO IP: 123.231.231.123 User: fred A message at INFO level with 2 parameters
- [Django]-OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: '<frozen importlib._bootstrap>' for a django project
- [Django]-Best practice to design django forms for CRUD operations
- [Django]-Django – Is it possible to prefetch multiple filters of a single field for a queryset?
Source:stackexchange.com