Почему логирование в модели Django - это кощунство?
Во всех проектах Django, которые я пишу, у меня есть общее приложение, и в этом приложении я размещаю вещи, которые полезны для проекта в целом. Одной из таких вещей является модель действий или событий, как, например, вот эта:
class Activity(models.Model):
SUMMARY_LENGTH = 72
def __str__(self):
return '%d:- %s' % (self.id, self.summary)
user = models.ForeignKey(User, null=True, blank=True, on_delete=models.PROTECT)
created = models.DateTimeField(db_index=True, auto_now_add=True, editable=False)
activity_type = models.PositiveIntegerField(choices=ActivityTypeEnum.choices, default=ActivityTypeEnum.LOG)
summary = models.CharField(max_length=SUMMARY_LENGTH, help_text='Text Shown in Staff Activity Log')
show = models.BooleanField(default=False, help_text='Show in Staff Activity Log')
page_url = models.URLField(max_length=128, blank=True)
ip_address = models.GenericIPAddressField(blank=True, null=True)
extra_detail = models.TextField(blank=True)
class Meta:
ordering = [ '-created' ]
def save(self, *args, **kwargs):
if len(self.summary) > self.SUMMARY_LENGTH:
self.summary = self.summary[:self.SUMMARY_LENGTH]
return super(Activity, self).save(*args, **kwargs)
Тогда у меня есть вспомогательная функция one liner, которую я могу поместить в любое место в моем коде, где я могу записать что-то в журнал, с разными типами журнала для разных видов событий.
def record_activity(activity_type=ActivityTypeEnum.LOG, summary='', extra_detail='', show=True,
makeme_string=None, job=None, request=None):
""" Record System Wide Activity Stuff. Not a member function,
becuase importing the model class everywhere is to be avoided """
if makeme_string:
try:
string_bit = json.dumps(makeme_string, sort_keys=True, indent=4, separators=(',', ': '), default=str)
except:
string_bit = 'Could not dump the makeme_string'
extra_detail += '\n=======================\n%s' % string_bit
from common.models import Activity
act = Activity(activity_type=activity_type,
summary=summary,
extra_detail=extra_detail or '',
show=show,
job=job)
if request:
if isinstance(request.user, User):
act.user = request.user
act.ip_address = request.location.get('ip', None)
protocol = request.is_secure() and 'https' or 'http' # When develping/testing use http
host = request.META.get('HTTP_HOST', 'testing.com')
act.page_url = "%s://%s%s" % (protocol, host, request.path)
act.save()
return act
Например, если у меня произошла ошибка, например, ошибка указателя типа none, я могу использовать оператор try, записать в журнал ошибку в случае исключения, и отправить запрос, который выдаст IP запроса и вошедшего пользователя.
Каждый раз, когда я поднимаю эту тему на собеседовании, кодеры сжимают лицо в отчаянии, как будто я пукнул в церкви, и говорят, что вместо этого нужно использовать AWS Cloudfront или какую-то другую технологию, потому что экземпляры больше не являются постоянными. Но Cloudfront - не самый простой из журналов для навигации, он полагается на какой-то интранет API вызов, я должен войти в консоль AWS, чтобы получить к нему доступ, и базы данных являются постоянными, независимо от экземпляра, использующего его. Я вхожу в Django Admin и Viola! Я могу фильтровать по типу активности, я могу искать в журналах, я могу поместить отладочный журнал, который ведет журнал только тогда, когда settings.DEBUG равен true, я могу узнать, что сайт упал, когда клиент с сумасшедшим европейским циркумфлексом C в имени обрушил сайт, когда пытался войти в систему.
Никто не объясняет суть проблемы. Если это безопасность, то насколько более безопасен Google Analytics? Если дело в емкости, то базы данных были разработаны для масштабирования, и у меня есть 1352633 активности в моем админке django, которая загружает 20 за раз, быстро ищет и фильтрует, а если она становится медленной, я могу автоматизировать что-то для ее архивирования.
Конечно, я использую Sentry для регистрации аварий, потому что вы не можете полагаться на то, что Activity будет сохранена при падении приложения. Это прекрасно, но иногда было бы неплохо знать, правильно ли вызывается API или кто-то пытается совершить DOS-атаку на ваше приложение.
Эти сайты не получают трафик с Facebook, они посещаются, возможно, 50 раз в день. Это кажется догмой, но, пожалуйста, если я упускаю что-то действительно очевидное, если мне на рубашку все это время проливали яичный салат, может кто-нибудь объяснить, в чем тут дело.
Спасибо @IainShelvington за то, что указал на то, что я должен был получить в обратной связи после собеседования. На самом деле в моем решении по протоколированию нет ничего плохого, но когда вы работаете с командой разработчиков и не являетесь лидером команды, вы должны соответствовать и уметь соответствовать, иначе есть риск, что вы нарушите динамику команды. Это отстой, и это сообщение нужно доносить мягко. За исходный вопрос принято понижение голоса, но я думаю, что этот жизненно важный пункт профессионалы, которые достаточно велики, чтобы учиться, должны прочитать.