Membuat Django Middleware Request dan Response Logger

Subscribe Dengan Account Google Untuk Membaca Artikel Tanpa Iklan
Membuat Django Middleware Request dan Response Logger

Ketika kita bekerja pada lingkungan sistem terdisribusi, yang mana sebuah service terhubung dengan service lain, monitoring log menjadi sebuah kebutuhan penting.

Setiap aktifitas dalam sistem terdistribusi harus di dokumentasikan, banyak cara yang bisa digunakan untuk menangani permasalahan ini.

Salah satu cara sederhana yang bisa Anda lakukan adalah mencatat setiap request body dan response body dan menyimpanya ke file log.

File log ini nantinya bisa kamu integrasikan dengan tools logs monitoring seperti grafana loki ataupun kibana.

Pada jango framework untuk menangani hal ini Anda perlu membuat sebuah middleware.

Langkah Pertama:



  1. Buat folder dengan nama middleware, satu direktori dengan file settings.py

  2. Buat file dengan nama __init__.py simpan di direktori middleware

  3. Buat file di direktori middleware dengan nama request_log.py


Perhatikan code request_log.py berikut ini

import socket, time, json, logging
from datetime import datetime

request_logger = logging.getLogger("api")

class RequestLogMiddleware:
"""Request Logging Middleware."""

def __init__(self, get_response):
self.get_response = get_response

def __call__(self, request):
start_time = time.time()
now = datetime.now()
log_data = {
"remote_address": request.META["REMOTE_ADDR"],
"server_hostname": socket.gethostname(),
"request_method": request.method,
"request_path": request.get_full_path(),
'client_id': request.headers.get('CLIENT-ID'),
}

if "/api/" in str(request.get_full_path()):
req_body = json.loads(request.body.decode("utf-8")) if request.body else {}
if request.get_full_path() == '/api/v1/users/login':
req_body['password'] = "xxxxxxx"
log_data["request_body"] = req_body

response = self.get_response(request)
if response and response["content-type"] == "application/json":
response_body = json.loads(response.content.decode("utf-8"))
log_data["response_body"] = response_body
log_data["run_time"] = time.time() - start_time
log_data["x_time"] = now.strftime("%Y-%m-%d %H:%M:%S")
request_logger.info(log_data)

return response

# Log unhandled exceptions as well
def process_exception(self, request, exception):
try:
raise exception
except Exception as e:
request_logger.exception("Unhandled Exception: " + str(e))
return exception

 

Langkah Kedua


Tambahkan kode berikut pada file settings.py

MIDDLEWARE = [
'...',
"{directory-name}.middleware.request_log.RequestLogMiddleware",
]

{directory-name} : ganti dengan di rectory main project Anda

Langkah Ketiga:


Setelah Anda membuat middleware logger selanjutnya yang perlu Anda buat adalah folder untuk menyimpan file log dan juga menambahkan konfigurasi logging pada django

  1. Buat sebuah folder pada direktori root project Anda dengan nama logfile

  2. Tambahkan konfigurasi logging pada settings.py


Perhatikan kode logging file berikut ini dan tambahkan di settings.py

LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {},
},
'handlers': {
'logfile': {
'level':'INFO',
'class':'logging.handlers.RotatingFileHandler',
'filename': "{}/logfile/logsfile.log".format(BASE_DIR),
'maxBytes': 5000,
'backupCount': 2,
'formatter': 'standard',
},
'console':{
'level':'INFO',
'class':'logging.StreamHandler',
'formatter': 'standard'
},
},
'loggers': {
'django': {
'handlers':['console'],
'propagate': True,
'level':'WARN',
},
'django.db.backends': {
'handlers': ['console'],
'level': 'INFO',
'propagate': True,
},
'api': {
'handlers': ['logfile'],
'level': 'INFO',
},
}
}

 

Pada kode berikut ini :

'logfile': {
'level':'INFO',
'class':'logging.handlers.RotatingFileHandler',
'filename': "{}/logfile/logsfile.log".format(BASE_DIR),
'maxBytes': 5000,
'backupCount': 2,
'formatter': 'standard',
}

 


  • filename, System akan membuat sebuah file logs dengan logsfile.log

  • maxBytes, setiap file logsfile.log telah mencapai 5000 bytes file akan di backup dan file baru akan dibuat otomatis oleh system


Jika semuanya berjalan lancar di folder logfile akan terbentuk file logsfile.log dan saat ada request ke path /api/, akan tersimpan logs seperti dibawah ini

{
'remote_address': '127.0.0.1',
'server_hostname': 'ip-192-168-8-105',
'request_method': 'POST',
'request_path': '/api/v1/users/login',
'client_id': 'test-api',
'request_body': {
'email': 'test@example.com',
'password': 'xxxxxxx'
},
'response_body': {
'message': 'User tidak ditemukan'
},
'run_time': 0.1308460235595703,
'x_time': '2022-08-25 08:43:03'
}

Githubhttps://github.com/halovina/hvsampleapi

Video :

Baca artikel lainya :