Tempat Paling Liar di Muka BumiAku ingin menjadi tenang dan mencintaimu tanpa banyak kekhawatiran. Theo dan Weslly telah menjelaskan dengan sangat baik kepada kita bagaimana jatuh cinta dan mencintai bisa begitu ajaib dan berbahaya. Buy |
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.
import socket, time, json, logging
from datetime import datetimerequest_logger = logging.getLogger("api")
class RequestLogMiddleware:
"""Request Logging Middleware."""def __init__(self, get_response):
self.get_response = get_responsedef __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
MIDDLEWARE = [
'...',
"{directory-name}.middleware.request_log.RequestLogMiddleware",
]
{directory-name} : ganti dengan di rectory main project Anda
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',
}
{
'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'
}
Github : https://github.com/halovina/hvsampleapi
Video :