django-activity-audit 1.3.0.dev12__tar.gz → 1.3.0.dev14__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/PKG-INFO +1 -1
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/__init__.py +8 -2
- django_activity_audit-1.3.0.dev14/activity_audit/constants.py +21 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/formatters.py +11 -9
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/handlers.py +3 -3
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/utils.py +14 -2
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/pyproject.toml +1 -1
- django_activity_audit-1.3.0.dev12/activity_audit/constants.py +0 -8
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/.gitignore +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/.pre-commit-config.yaml +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/LICENSE +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/MANIFEST.in +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/README.md +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/README.rst +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/REVIEW.md +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/apps.py +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/logger_levels.py +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/middleware.py +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/protocols.py +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/settings.py +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/signals.py +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/unregistered.py +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/docs/django-activity-audit.md +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/docs/user-activity-feed-plan.md +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/hatch +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/pytest.ini +0 -0
- {django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: django-activity-audit
|
|
3
|
-
Version: 1.3.0.
|
|
3
|
+
Version: 1.3.0.dev14
|
|
4
4
|
Summary: A Django package for easy CRUD operation logging and container logs
|
|
5
5
|
Project-URL: Homepage, https://github.com/shree256/django-activity-audit
|
|
6
6
|
Project-URL: Repository, https://github.com/shree256/django-activity-audit
|
{django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/__init__.py
RENAMED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
default_app_config = "activity_audit.apps.AuditLoggingConfig"
|
|
2
2
|
|
|
3
|
+
from activity_audit.constants import LogType
|
|
3
4
|
from activity_audit.utils import (
|
|
4
5
|
get_api_handler,
|
|
5
6
|
get_async_api_handler,
|
|
@@ -8,7 +9,9 @@ from activity_audit.utils import (
|
|
|
8
9
|
get_async_login_handler,
|
|
9
10
|
get_audit_handler,
|
|
10
11
|
get_console_formatter,
|
|
11
|
-
|
|
12
|
+
get_app_formatter,
|
|
13
|
+
get_api_formatter,
|
|
14
|
+
get_audit_formatter,
|
|
12
15
|
get_json_handler,
|
|
13
16
|
get_login_handler,
|
|
14
17
|
)
|
|
@@ -16,8 +19,11 @@ from activity_audit.utils import (
|
|
|
16
19
|
from . import logger_levels
|
|
17
20
|
|
|
18
21
|
__all__ = [
|
|
22
|
+
"LogType",
|
|
19
23
|
"get_console_formatter",
|
|
20
|
-
"
|
|
24
|
+
"get_app_formatter",
|
|
25
|
+
"get_api_formatter",
|
|
26
|
+
"get_audit_formatter",
|
|
21
27
|
"get_json_handler",
|
|
22
28
|
"get_api_handler",
|
|
23
29
|
"get_audit_handler",
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import enum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class LogType(str, enum.Enum):
|
|
5
|
+
APP = "app"
|
|
6
|
+
API = "api"
|
|
7
|
+
AUDIT = "audit"
|
|
8
|
+
LOGIN = "login"
|
|
9
|
+
CELERYWORKER = "celeryworker"
|
|
10
|
+
CELERYBEAT = "celerybeat"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
CONSOLE_FORMAT = (
|
|
14
|
+
"%(levelname)s %(asctime)s %(pathname)s %(module)s %(funcName)s %(message)s"
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
REQUEST_TYPES = [
|
|
18
|
+
"internal",
|
|
19
|
+
"external",
|
|
20
|
+
]
|
|
21
|
+
|
{django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/formatters.py
RENAMED
|
@@ -4,6 +4,7 @@ import json
|
|
|
4
4
|
import logging
|
|
5
5
|
import uuid
|
|
6
6
|
|
|
7
|
+
from .constants import LogType
|
|
7
8
|
|
|
8
9
|
def _json_default(obj):
|
|
9
10
|
"""
|
|
@@ -29,9 +30,10 @@ def _json_default(obj):
|
|
|
29
30
|
return str(obj)
|
|
30
31
|
|
|
31
32
|
|
|
32
|
-
class
|
|
33
|
-
def __init__(self, timestamp_format: str = "%Y-%m-%d %H:%M:%S.%f"):
|
|
33
|
+
class AppFormatter(logging.Formatter):
|
|
34
|
+
def __init__(self, log_type: str = LogType.APP, timestamp_format: str = "%Y-%m-%d %H:%M:%S.%f"):
|
|
34
35
|
super().__init__()
|
|
36
|
+
self.log_type = log_type
|
|
35
37
|
self.timestamp_format = timestamp_format
|
|
36
38
|
|
|
37
39
|
def format(
|
|
@@ -50,25 +52,22 @@ class JsonFormatter(logging.Formatter):
|
|
|
50
52
|
"request_id": getattr(record, "request_id", "") or "",
|
|
51
53
|
"message": record.getMessage(),
|
|
52
54
|
"exception": "",
|
|
53
|
-
|
|
55
|
+
"log_type": self.log_type,
|
|
54
56
|
}
|
|
55
57
|
|
|
56
58
|
# Add exception info if present for ERROR
|
|
57
59
|
if record.exc_info:
|
|
58
60
|
log_data["exception"] = "{}".format(self.formatException(record.exc_info))
|
|
59
61
|
|
|
60
|
-
# Add extra fields if present
|
|
61
|
-
# if hasattr(record, "extra"):
|
|
62
|
-
# log_data.update(record.extra)
|
|
63
|
-
|
|
64
62
|
return json.dumps(log_data, default=_json_default)
|
|
65
63
|
|
|
66
64
|
|
|
67
65
|
class APIFormatter(logging.Formatter):
|
|
68
66
|
"""Custom formatter for audit logs that ensures consistent JSON formatting."""
|
|
69
67
|
|
|
70
|
-
def __init__(self, timestamp_format: str = "%Y-%m-%d %H:%M:%S.%f"):
|
|
68
|
+
def __init__(self, log_type: str = LogType.API, timestamp_format: str = "%Y-%m-%d %H:%M:%S.%f"):
|
|
71
69
|
super().__init__()
|
|
70
|
+
self.log_type = log_type
|
|
72
71
|
self.timestamp_format = timestamp_format
|
|
73
72
|
|
|
74
73
|
def format(self, record):
|
|
@@ -80,6 +79,7 @@ class APIFormatter(logging.Formatter):
|
|
|
80
79
|
"level": record.levelname,
|
|
81
80
|
"name": record.name,
|
|
82
81
|
"message": record.getMessage(),
|
|
82
|
+
"log_type": self.log_type,
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
# Add all audit-specific fields if they exist
|
|
@@ -102,8 +102,9 @@ class APIFormatter(logging.Formatter):
|
|
|
102
102
|
|
|
103
103
|
|
|
104
104
|
class AuditFormatter(logging.Formatter):
|
|
105
|
-
def __init__(self, timestamp_format: str = "%Y-%m-%d %H:%M:%S.%f"):
|
|
105
|
+
def __init__(self, log_type: str = LogType.AUDIT, timestamp_format: str = "%Y-%m-%d %H:%M:%S.%f"):
|
|
106
106
|
super().__init__()
|
|
107
|
+
self.log_type = log_type
|
|
107
108
|
self.timestamp_format = timestamp_format
|
|
108
109
|
|
|
109
110
|
def format(self, record):
|
|
@@ -114,6 +115,7 @@ class AuditFormatter(logging.Formatter):
|
|
|
114
115
|
"level": record.levelname,
|
|
115
116
|
"name": record.name,
|
|
116
117
|
"message": record.getMessage(),
|
|
118
|
+
"log_type": self.log_type,
|
|
117
119
|
}
|
|
118
120
|
|
|
119
121
|
audit_fields = [
|
{django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/handlers.py
RENAMED
|
@@ -3,7 +3,7 @@ import queue
|
|
|
3
3
|
|
|
4
4
|
from logging.handlers import QueueHandler, QueueListener, RotatingFileHandler
|
|
5
5
|
|
|
6
|
-
from .formatters import APIFormatter, AuditFormatter,
|
|
6
|
+
from .formatters import APIFormatter, AuditFormatter, AppFormatter, LoginFormatter
|
|
7
7
|
from .middleware import get_request_id
|
|
8
8
|
|
|
9
9
|
|
|
@@ -145,7 +145,7 @@ class AsyncLoginLogHandler(AsyncBaseAuditHandler):
|
|
|
145
145
|
class AsyncJsonHandler(QueueHandler):
|
|
146
146
|
"""
|
|
147
147
|
Non-blocking handler for general JSON logs. Wraps a RotatingFileHandler
|
|
148
|
-
with
|
|
148
|
+
with AppFormatter on the background thread.
|
|
149
149
|
"""
|
|
150
150
|
|
|
151
151
|
def __init__(
|
|
@@ -163,7 +163,7 @@ class AsyncJsonHandler(QueueHandler):
|
|
|
163
163
|
sync_handler = RotatingFileHandler(
|
|
164
164
|
filename, mode, maxBytes, backupCount, encoding, delay
|
|
165
165
|
)
|
|
166
|
-
sync_handler.setFormatter(
|
|
166
|
+
sync_handler.setFormatter(AppFormatter())
|
|
167
167
|
self._listener = QueueListener(
|
|
168
168
|
log_queue, sync_handler, respect_handler_level=True
|
|
169
169
|
)
|
{django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/utils.py
RENAMED
|
@@ -7,9 +7,20 @@ def get_console_formatter() -> dict:
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
def
|
|
10
|
+
def get_app_formatter(log_type: str = "app") -> dict:
|
|
11
11
|
return {
|
|
12
|
-
"()": "activity_audit.formatters.
|
|
12
|
+
"()": "activity_audit.formatters.AppFormatter",
|
|
13
|
+
"log_type": log_type,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
def get_api_formatter() -> dict:
|
|
17
|
+
return {
|
|
18
|
+
"()": "activity_audit.formatters.APIFormatter"
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
def get_audit_formatter() -> dict:
|
|
22
|
+
return {
|
|
23
|
+
"()": "activity_audit.formatters.AuditFormatter"
|
|
13
24
|
}
|
|
14
25
|
|
|
15
26
|
|
|
@@ -30,6 +41,7 @@ def get_json_handler(
|
|
|
30
41
|
}
|
|
31
42
|
|
|
32
43
|
|
|
44
|
+
|
|
33
45
|
def get_api_handler(
|
|
34
46
|
filename: str = "audit_logs/api.log",
|
|
35
47
|
) -> dict:
|
|
File without changes
|
{django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/.pre-commit-config.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/REVIEW.md
RENAMED
|
File without changes
|
{django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/apps.py
RENAMED
|
File without changes
|
|
File without changes
|
{django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/middleware.py
RENAMED
|
File without changes
|
{django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/protocols.py
RENAMED
|
File without changes
|
{django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/settings.py
RENAMED
|
File without changes
|
{django_activity_audit-1.3.0.dev12 → django_activity_audit-1.3.0.dev14}/activity_audit/signals.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|