This commit is contained in:
parent
d664f42966
commit
6b22195040
12 changed files with 105 additions and 0 deletions
Binary file not shown.
|
|
@ -1,3 +1,5 @@
|
|||
import logging
|
||||
audit_logger = logging.getLogger('audit')
|
||||
from rest_framework import status, permissions
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
|
|
@ -11,6 +13,7 @@ class UserRegisterView(APIView):
|
|||
serializer = UserRegisterSerializer(data=request.data)
|
||||
if serializer.is_valid():
|
||||
serializer.save()
|
||||
audit_logger.info(f"AUDIT - User Register: Username '{serializer.validated_data.get('username')}' registered successfully.")
|
||||
return Response({"message": "User registered successfully"}, status=status.HTTP_201_CREATED)
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
|
|
|||
BIN
customerwebsitebackend/__pycache__/middleware.cpython-312.pyc
Normal file
BIN
customerwebsitebackend/__pycache__/middleware.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
20
customerwebsitebackend/middleware.py
Normal file
20
customerwebsitebackend/middleware.py
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
import logging
|
||||
import time
|
||||
|
||||
logger = logging.getLogger('django.request')
|
||||
|
||||
class RequestLoggingMiddleware:
|
||||
def __init__(self, get_response):
|
||||
self.get_response = get_response
|
||||
|
||||
def __call__(self, request):
|
||||
start_time = time.time()
|
||||
response = self.get_response(request)
|
||||
duration = time.time() - start_time
|
||||
|
||||
ip = request.META.get('REMOTE_ADDR')
|
||||
logger.info(
|
||||
f"IP: {ip} | {request.method} {request.get_full_path()} | "
|
||||
f"Status: {response.status_code} | Duration: {duration:.3f}s"
|
||||
)
|
||||
return response
|
||||
|
|
@ -46,6 +46,7 @@ INSTALLED_APPS = [
|
|||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
'customerwebsitebackend.middleware.RequestLoggingMiddleware',
|
||||
'corsheaders.middleware.CorsMiddleware',
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
|
|
@ -159,3 +160,79 @@ SIMPLE_JWT = {
|
|||
'USER_ID_FIELD': 'id',
|
||||
'USER_ID_CLAIM': 'user_id',
|
||||
}
|
||||
|
||||
# Logging configuration for app, request, and audit logs
|
||||
import os
|
||||
LOGS_DIR = os.path.join(BASE_DIR, 'logs')
|
||||
if not os.path.exists(LOGS_DIR):
|
||||
os.makedirs(LOGS_DIR)
|
||||
|
||||
LOGGING = {
|
||||
'version': 1,
|
||||
'disable_existing_loggers': False,
|
||||
'formatters': {
|
||||
'verbose': {
|
||||
'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
|
||||
'style': '{',
|
||||
},
|
||||
'simple': {
|
||||
'format': '{levelname} {asctime} {message}',
|
||||
'style': '{',
|
||||
},
|
||||
},
|
||||
'handlers': {
|
||||
'console': {
|
||||
'class': 'logging.StreamHandler',
|
||||
'formatter': 'simple',
|
||||
},
|
||||
'app_file': {
|
||||
'level': 'INFO',
|
||||
'class': 'logging.handlers.RotatingFileHandler',
|
||||
'filename': os.path.join(LOGS_DIR, 'app.log'),
|
||||
'maxBytes': 1024 * 1024 * 5, # 5MB
|
||||
'backupCount': 5,
|
||||
'formatter': 'verbose',
|
||||
},
|
||||
'error_file': {
|
||||
'level': 'ERROR',
|
||||
'class': 'logging.handlers.RotatingFileHandler',
|
||||
'filename': os.path.join(LOGS_DIR, 'error.log'),
|
||||
'maxBytes': 1024 * 1024 * 5, # 5MB
|
||||
'backupCount': 5,
|
||||
'formatter': 'verbose',
|
||||
},
|
||||
'requests_file': {
|
||||
'level': 'INFO',
|
||||
'class': 'logging.handlers.RotatingFileHandler',
|
||||
'filename': os.path.join(LOGS_DIR, 'requests.log'),
|
||||
'maxBytes': 1024 * 1024 * 5, # 5MB
|
||||
'backupCount': 5,
|
||||
'formatter': 'simple',
|
||||
},
|
||||
'audit_file': {
|
||||
'level': 'INFO',
|
||||
'class': 'logging.handlers.RotatingFileHandler',
|
||||
'filename': os.path.join(LOGS_DIR, 'audit.log'),
|
||||
'maxBytes': 1024 * 1024 * 5, # 5MB
|
||||
'backupCount': 5,
|
||||
'formatter': 'verbose',
|
||||
},
|
||||
},
|
||||
'loggers': {
|
||||
'django': {
|
||||
'handlers': ['console', 'app_file', 'error_file'],
|
||||
'level': 'INFO',
|
||||
'propagate': True,
|
||||
},
|
||||
'django.request': {
|
||||
'handlers': ['requests_file', 'error_file'],
|
||||
'level': 'INFO',
|
||||
'propagate': False,
|
||||
},
|
||||
'audit': {
|
||||
'handlers': ['audit_file', 'console'],
|
||||
'level': 'INFO',
|
||||
'propagate': False,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
|
|||
1
logs/app.log
Normal file
1
logs/app.log
Normal file
|
|
@ -0,0 +1 @@
|
|||
INFO 2026-08-14 13:39:12,598 autoreload 55158 134155813900416 Watching for file changes with StatReloader
|
||||
0
logs/audit.log
Normal file
0
logs/audit.log
Normal file
0
logs/error.log
Normal file
0
logs/error.log
Normal file
0
logs/requests.log
Normal file
0
logs/requests.log
Normal file
Binary file not shown.
|
|
@ -1,3 +1,5 @@
|
|||
import logging
|
||||
audit_logger = logging.getLogger('audit')
|
||||
from rest_framework import status, permissions
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
|
|
@ -98,6 +100,7 @@ class CheckoutView(APIView):
|
|||
razorpay_order_id=razorpay_order_id,
|
||||
shipping_address=shipping_address
|
||||
)
|
||||
audit_logger.info(f"AUDIT - Checkout: User '{user.username}' created order ID {order.id} for amount ${total_amount:.2f}.")
|
||||
|
||||
for item in items:
|
||||
OrderItem.objects.create(
|
||||
|
|
@ -136,6 +139,7 @@ class PaymentSuccessView(APIView):
|
|||
order.status = 'confirmed'
|
||||
order.razorpay_payment_id = payment_id
|
||||
order.save()
|
||||
audit_logger.info(f"AUDIT - Payment Success: User '{request.user.username}' successfully paid order ID {order.id} (Payment ID: {payment_id}).")
|
||||
|
||||
return Response({"message": "Payment verified and order confirmed"})
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue