diff --git a/logtracker/journal/management/commands/dump.py b/logtracker/journal/management/commands/dump.py index 82718e9..2c8efde 100644 --- a/logtracker/journal/management/commands/dump.py +++ b/logtracker/journal/management/commands/dump.py @@ -16,10 +16,12 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument("--full", action="store_true") parser.add_argument("-n", "--lines", default=100) + parser.add_argument('options', nargs="*") def handle(self, *args, **options): _, columns = os.popen("stty size", "r").read().split() - for entry in Entry.objects.dump(lines=options['lines']): + kwargs = {k: v for (k, v) in [o.split('=') for o in options['options']]} + for entry in Entry.objects.dump(lines=options['lines'], **kwargs): line = "%s %s %s %s" % ( entry.timestamp.astimezone().strftime("%b %d %X"), entry.host, diff --git a/logtracker/journal/models.py b/logtracker/journal/models.py index 89ccf50..ff41ad3 100644 --- a/logtracker/journal/models.py +++ b/logtracker/journal/models.py @@ -1,22 +1,35 @@ from django.db import models from django.contrib.postgres.fields import JSONField from django.contrib.postgres.fields.jsonb import KeyTextTransform +from django.utils.functional import cached_property class EntryManager(models.Manager): - def dump(self, host=None, message=None, lines=100): - if message: - qs = Entry.objects.annotate(message=KeyTextTransform('MESSAGE', 'data')) - else: - qs = Entry.objects.all() + + def dump(self, timestamp=None, host=None, lines=100, **kwargs): + qs = Entry.objects.all() if host: qs = qs.filter(host=host) - if message: - qs = qs.filter(message__contains=message) + qs = qs.filter(**self.parse_options(**kwargs)) if lines: qs = qs.order_by('-timestamp')[:int(lines)][::-1] return qs + def parse_options(self, mode='exact', **kwargs): + # todo mode='contains' require jsonb KeyTextTransform and probably annotations + options = {} + for k, v in kwargs.items(): + options['data__' + k.upper() + '__%s' % mode] = v + return options + + @cached_property + def hosts(self): + return self.model.objects.all().values_list('host', flat=True).distinct() + + @cached_property + def units(self): + return self.model.objects.all().annotate(unit=KeyTextTransform('_SYSTEMD_UNIT', 'data')).values_list('unit', flat=True).distinct() + class Entry(models.Model): timestamp = models.DateTimeField(auto_now_add=True, db_index=True) diff --git a/logtracker/journal/templates/base.html b/logtracker/journal/templates/base.html index 32238fa..5f365e3 100644 --- a/logtracker/journal/templates/base.html +++ b/logtracker/journal/templates/base.html @@ -1,7 +1,7 @@
-