Xiaomi Watch 2 | Snapdragon W5+ Gen 1Nikmati kecerdasan seperti belum pernah terjadi sebelumnya dengan Xiaomi Watch 2, didukung oleh Google Wear OS. Rasakan kemudahan menggunakan aplikasi Google bawaan dan beragam aplikasi pihak ketiga untuk performa optimal dan penggunaan yang mulus. Akses Lebih Banyak Aplikasi dengan Google Play: Akses lebih dari 200 aplikasi pihak ketiga yang populer yang mencakup hampir setiap aspek kehidupan Anda dengan mudah dan nyaman. Free Klik Disini ! |
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 :