Skip to content

API field length to 1024, masking available for list of dicts, timezone added #32

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Dec 21, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 22 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# DRF API Logger
![version](https://img.shields.io/badge/version-1.0.8-blue.svg)
![version](https://img.shields.io/badge/version-1.0.9-blue.svg)
[![Downloads](https://static.pepy.tech/personalized-badge/drf-api-logger?period=total&units=none&left_color=black&right_color=orange&left_text=Downloads%20Total)](http://pepy.tech/project/drf-api-logger)
[![Downloads](https://static.pepy.tech/personalized-badge/drf-api-logger?period=month&units=none&left_color=black&right_color=orange&left_text=Downloads%20Last%20Month)](https://pepy.tech/project/drf-api-logger)
[![Downloads](https://static.pepy.tech/personalized-badge/drf-api-logger?period=week&units=none&left_color=black&right_color=orange&left_text=Downloads%20Last%20Week)](https://pepy.tech/project/drf-api-logger)
Expand Down Expand Up @@ -175,13 +175,6 @@ Make sure to migrate the database specified in DRF_API_LOGGER_DEFAULT_DATABASE.
"""
```

### API with or without Host
You can specify an endpoint of API should have absolute URI or not by setting this variable in DRF settings.py file.
```python
DRF_API_LOGGER_PATH_TYPE = 'ABSOLUTE' # Default to ABSOLUTE if not specified
# Possible values are ABSOLUTE, FULL_PATH or RAW_URI
```

### Want to identify slow APIs? (Optional)
You can also identify slow APIs by specifying `DRF_API_LOGGER_SLOW_API_ABOVE` in settings.py.

Expand All @@ -191,6 +184,26 @@ DRF_API_LOGGER_SLOW_API_ABOVE = 200 # Default to None
# Specify in milli-seconds.
```

### Want to see the API information in local timezone? (Optional)
You can also identify slow APIs by specifying `DRF_API_LOGGER_TIMEDELTA` in settings.py.
It is going to display the API request time after adding the timedelta specified in the settings.py file.
It won't change the Database timezone.
```python
DRF_API_LOGGER_TIMEDELTA = 330 # UTC + 330 Minutes = IST (5:Hours, 30:Minutes ahead from UTC)
# Specify in minutes.
```
```python
# Yoc can specify negative values for the countries behind the UTC timezone.
DRF_API_LOGGER_TIMEDELTA = -30 # Example
```

### API with or without Host
You can specify an endpoint of API should have absolute URI or not by setting this variable in DRF settings.py file.
```python
DRF_API_LOGGER_PATH_TYPE = 'ABSOLUTE' # Default to ABSOLUTE if not specified
# Possible values are ABSOLUTE, FULL_PATH or RAW_URI
```

Considering we are accessing the following URL: http://127.0.0.1:8000/api/v1/?page=123
DRF_API_LOGGER_PATH_TYPE possible values are:
1. ABSOLUTE (Default) :
Expand Down Expand Up @@ -232,7 +245,7 @@ DRF API Logger Model:
```
class APILogsModel(Model):
id = models.BigAutoField(primary_key=True)
api = models.CharField(max_length=512, help_text='API URL')
api = models.CharField(max_length=1024, help_text='API URL')
headers = models.TextField()
body = models.TextField()
method = models.CharField(max_length=10, db_index=True)
Expand Down
Binary file added dist/drf_api_logger-1.0.9.tar.gz
Binary file not shown.
16 changes: 10 additions & 6 deletions drf_api_logger/admin.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from datetime import timedelta

from django.conf import settings
from django.contrib import admin
from django.db.models import Count
Expand All @@ -17,7 +19,7 @@ def __init__(self, request, params, model, model_admin):
super().__init__(request, params, model, model_admin)
if hasattr(settings, 'DRF_API_LOGGER_SLOW_API_ABOVE'):
if type(settings.DRF_API_LOGGER_SLOW_API_ABOVE) == int: # Making sure for integer value.
self.DRF_API_LOGGER_SLOW_API_ABOVE = settings.DRF_API_LOGGER_SLOW_API_ABOVE / 1000 # Converting to seconds.
self._DRF_API_LOGGER_SLOW_API_ABOVE = settings.DRF_API_LOGGER_SLOW_API_ABOVE / 1000 # Converting to seconds.

def lookups(self, request, model_admin):
"""
Expand Down Expand Up @@ -46,24 +48,26 @@ def queryset(self, request, queryset):
"""
# to decide how to filter the queryset.
if self.value() == 'slow':
return queryset.filter(execution_time__gte=self.DRF_API_LOGGER_SLOW_API_ABOVE)
return queryset.filter(execution_time__gte=self._DRF_API_LOGGER_SLOW_API_ABOVE)
if self.value() == 'fast':
return queryset.filter(execution_time__lt=self.DRF_API_LOGGER_SLOW_API_ABOVE)
return queryset.filter(execution_time__lt=self._DRF_API_LOGGER_SLOW_API_ABOVE)

return queryset

class APILogsAdmin(admin.ModelAdmin):

def __init__(self, model, admin_site):
super().__init__(model, admin_site)
self.DRF_API_LOGGER_SLOW_API_ABOVE = None
self._DRF_API_LOGGER_TIMEDELTA = 0
if hasattr(settings, 'DRF_API_LOGGER_SLOW_API_ABOVE'):
if type(settings.DRF_API_LOGGER_SLOW_API_ABOVE) == int: # Making sure for integer value.
self.DRF_API_LOGGER_SLOW_API_ABOVE = settings.DRF_API_LOGGER_SLOW_API_ABOVE / 1000 # Converting to seconds.
self.list_filter += (SlowAPIsFilter,)
if hasattr(settings, 'DRF_API_LOGGER_TIMEDELTA'):
if type(settings.DRF_API_LOGGER_TIMEDELTA) == int: # Making sure for integer value.
self._DRF_API_LOGGER_TIMEDELTA = settings.DRF_API_LOGGER_TIMEDELTA

def added_on_time(self, obj):
return obj.added_on.strftime("%d %b %Y %H:%M:%S")
return (obj.added_on + timedelta(minutes=self._DRF_API_LOGGER_TIMEDELTA)).strftime("%d %b %Y %H:%M:%S")

added_on_time.admin_order_field = 'added_on'
added_on_time.short_description = 'Added on'
Expand Down
18 changes: 18 additions & 0 deletions drf_api_logger/migrations/0002_auto_20211221_2155.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.1.5 on 2021-12-21 16:25

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('drf_api_logger', '0001_initial'),
]

operations = [
migrations.AlterField(
model_name='apilogsmodel',
name='api',
field=models.CharField(help_text='API URL', max_length=1024),
),
]
2 changes: 1 addition & 1 deletion drf_api_logger/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class Meta:


class APILogsModel(BaseModel):
api = models.CharField(max_length=512, help_text='API URL')
api = models.CharField(max_length=1024, help_text='API URL')
headers = models.TextField()
body = models.TextField()
method = models.CharField(max_length=10, db_index=True)
Expand Down
14 changes: 9 additions & 5 deletions drf_api_logger/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
if type(settings.DRF_API_LOGGER_EXCLUDE_KEYS) in (list, tuple):
SENSITIVE_KEYS.extend(settings.DRF_API_LOGGER_EXCLUDE_KEYS)


def get_headers(request=None):
"""
Function: get_headers(self, request)
Expand Down Expand Up @@ -53,13 +54,16 @@ def mask_sensitive_data(data):
"""

if type(data) != dict:
return data
return data

for key, value in data.items():
if key in SENSITIVE_KEYS:
data[key] = "***FILTERED***"
if key in SENSITIVE_KEYS:
data[key] = "***FILTERED***"

if type(value) == dict:
data[key] = mask_sensitive_data(data[key])

if type(value) == dict:
data[key] = mask_sensitive_data(data[key])
if type(value) == list:
data[key] = [mask_sensitive_data(item) for item in data[key]]

return data
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def get_long_desc():

setuptools.setup(
name="drf_api_logger",
version="1.0.8",
version="1.0.9",
author="Vishal Anand",
author_email="[email protected]",
description="An API Logger for your Django Rest Framework project.",
Expand Down