Use JSONLogger to log audit event information

This commit is contained in:
Montana 2019-04-03 15:39:18 -04:00
parent f1c6717a1e
commit 747a59825a
3 changed files with 31 additions and 4 deletions

View File

@ -25,6 +25,19 @@ class AuditEvent(Base, TimestampsMixin):
display_name = Column(String())
action = Column(String(), nullable=False)
@property
def log(self):
return {
"user_id": str(self.id),
"portfolio_id": str(self.portfolio_id),
"changed_state": self.changed_state,
"event_details": self.event_details,
"resource_type": self.resource_type,
"resource_id": str(self.resource_id),
"display_name": self.display_name,
"action": self.action,
}
def save(self, connection):
attrs = inspect(self).dict

View File

@ -1,5 +1,5 @@
from sqlalchemy import event, inspect
from flask import g
from flask import g, current_app as app
from atst.models.audit_event import AuditEvent
from atst.utils import camel_to_snake, getattr_path
@ -32,6 +32,7 @@ class AuditableMixin(object):
)
audit_event.save(connection)
return audit_event
@classmethod
def __declare_last__(cls):
@ -42,17 +43,29 @@ class AuditableMixin(object):
@staticmethod
def audit_insert(mapper, connection, target):
"""Listen for the `after_insert` event and create an AuditLog entry"""
target.create_audit_event(connection, target, ACTION_CREATE)
event = target.create_audit_event(connection, target, ACTION_CREATE)
app.logger.info(
"Audit Event insert",
extra={"audit_event": event.log, "tags": ["audit_event", "insert"]},
)
@staticmethod
def audit_delete(mapper, connection, target):
"""Listen for the `after_delete` event and create an AuditLog entry"""
target.create_audit_event(connection, target, ACTION_DELETE)
event = target.create_audit_event(connection, target, ACTION_DELETE)
app.logger.info(
"Audit Event delete",
extra={"audit_event": event.log, "tags": ["audit_event", "delete"]},
)
@staticmethod
def audit_update(mapper, connection, target):
if AuditableMixin.get_changes(target):
target.create_audit_event(connection, target, ACTION_UPDATE)
event = target.create_audit_event(connection, target, ACTION_UPDATE)
app.logger.info(
"Audit Event update",
extra={"audit_event": event.log, "tags": ["audit_event", "update"]},
)
def get_changes(self):
"""

View File

@ -31,6 +31,7 @@ class JsonFormatter(logging.Formatter):
("severity", lambda r: r.levelname),
("tags", lambda r: r.__dict__.get("tags")),
("message", lambda r: r.msg),
("audit_event", lambda r: r.__dict__.get("audit_event")),
]
def format(self, record):