Skip to content

Commit 3c2e875

Browse files
committed
initial working code
0 parents  commit 3c2e875

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

djangodblog/__init__.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from models import Error, ErrorBatch
2+
3+
import traceback
4+
import socket
5+
import warnings
6+
import md5
7+
8+
class DBLogMiddleware(object):
9+
def process_exception(self, request, exception):
10+
server_name = socket.gethostname()
11+
tb_text = traceback.format_exc()
12+
class_name = exception.__class__.__name__
13+
checksum = md5.new(tb_text).hexdigest()
14+
15+
defaults = dict(
16+
class_name = class_name,
17+
message = exception.message,
18+
url = request.build_absolute_uri(),
19+
server_name = server_name,
20+
traceback = tb_text,
21+
)
22+
23+
try:
24+
Error.objects.create(**defaults)
25+
batch, created = ErrorBatch.objects.get_or_create(
26+
class_name = class_name,
27+
server_name = server_name,
28+
checksum = checksum,
29+
defaults = defaults
30+
)
31+
if not created:
32+
batch.times_seen += 1
33+
batch.save()
34+
except Exception, exc:
35+
warnings.warn(unicode(exc))

djangodblog/models.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from django.db import models
2+
from django.utils.translation import ugettext_lazy as _
3+
4+
import datetime
5+
6+
class ErrorBatch(models.Model):
7+
class_name = models.CharField(_('Type'), max_length=128)
8+
message = models.TextField()
9+
traceback = models.TextField()
10+
times_seen = models.PositiveIntegerField(default=1)
11+
last_seen = models.DateTimeField(default=datetime.datetime.now)
12+
first_seen = models.DateTimeField(default=datetime.datetime.now)
13+
url = models.URLField(verify_exists=False, null=True, blank=True)
14+
server_name = models.CharField(max_length=128, db_index=True)
15+
checksum = models.CharField(max_length=32, db_index=True)
16+
17+
class Admin:
18+
list_display = ('class_name', 'message', 'last_seen', 'times_seen', 'url', 'server_name')
19+
list_filter = ('class_name', 'times_seen', 'server_name')
20+
ordering = ('-last_seen',)
21+
22+
class Meta:
23+
unique_together = (('class_name', 'server_name', 'checksum'),)
24+
25+
class Error(models.Model):
26+
class_name = models.CharField(_('type'), max_length=128)
27+
message = models.TextField()
28+
traceback = models.TextField()
29+
datetime = models.DateTimeField(default=datetime.datetime.now)
30+
url = models.URLField(verify_exists=False, null=True, blank=True)
31+
server_name = models.CharField(max_length=128, db_index=True)
32+
33+
class Admin:
34+
list_display = ('class_name', 'message', 'datetime', 'url', 'server_name')
35+
list_filter = ('class_name', 'datetime', 'server_name')
36+
ordering = ('-datetime',)

0 commit comments

Comments
 (0)