Skip to content

Commit a841006

Browse files
Merge pull request #18 from Kelvin4664/hide-sensitive-data
Filter sensitive keys from logs
2 parents 04b6027 + 1c6fba8 commit a841006

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,12 @@ DRF_API_LOGGER_SKIP_URL_NAME = ['url_name1', 'url_name2']
155155

156156
Note: It does not log Django Admin Panel API calls.
157157

158+
### Hide Sensitive Data From Logs
159+
You may wish to hide sensitive information from being exposed in the logs. You do this by setting `DRF_API_LOGGER_EXCLUDE_KEYS` in settings.py to a list of your desired sensitive keys. The default is
160+
```python
161+
DRF_API_LOGGER_EXCLUDE_KEYS = ['password', 'token', 'access', 'refresh']
162+
```
163+
158164
### API with or without Host
159165
You can specify an endpoint of API should have absolute URI or not by setting this variable in DRF settings.py file.
160166
```python

drf_api_logger/middleware/api_logger_middleware.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from drf_api_logger import API_LOGGER_SIGNAL
99
from drf_api_logger.start_logger_when_server_starts import LOGGER_THREAD
10-
from drf_api_logger.utils import get_headers, get_client_ip
10+
from drf_api_logger.utils import get_headers, get_client_ip, mask_sensitive_data
1111

1212
"""
1313
File: api_logger_middleware.py
@@ -100,11 +100,11 @@ def __call__(self, request):
100100

101101
data = dict(
102102
api=api,
103-
headers=headers,
104-
body=request_data,
103+
headers=mask_sensitive_data(headers),
104+
body=mask_sensitive_data(request_data),
105105
method=method,
106106
client_ip_address=get_client_ip(request),
107-
response=response_body,
107+
response=mask_sensitive_data(response_body),
108108
status_code=response.status_code,
109109
execution_time=time.time() - start_time,
110110
added_on=timezone.now()

drf_api_logger/utils.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import re
22
from django.conf import settings
33

4+
SENSITIVE_KEYS = ['password', 'token', 'access', 'refresh']
5+
if hasattr(settings, 'DRF_API_LOGGER_EXCLUDE_KEYS'):
6+
if type(settings.DRF_API_LOGGER_EXCLUDE_KEYS) in (list, tuple):
7+
SENSITIVE_KEYS.extend(settings.DRF_API_LOGGER_EXCLUDE_KEYS)
48

59
def get_headers(request=None):
610
"""
@@ -40,3 +44,22 @@ def database_log_enabled():
4044
if hasattr(settings, 'DRF_API_LOGGER_DATABASE'):
4145
drf_api_logger_database = settings.DRF_API_LOGGER_DATABASE
4246
return drf_api_logger_database
47+
48+
49+
def mask_sensitive_data(data):
50+
"""
51+
Hides sensitive keys specified in sensitive_keys settings.
52+
Loops recursively over nested dictionaries.
53+
"""
54+
55+
if type(data) != dict:
56+
return data
57+
58+
for key, value in data.items():
59+
if key in SENSITIVE_KEYS:
60+
data[key] = "***FILTERED***"
61+
62+
if type(value) == dict:
63+
data[key] = mask_sensitive_data(data[key])
64+
65+
return data

0 commit comments

Comments
 (0)