diff --git a/debian/bin/logtracker b/debian/bin/logtracker index af8b38b..9c67ada 100755 --- a/debian/bin/logtracker +++ b/debian/bin/logtracker @@ -1,7 +1,7 @@ #!/bin/sh args=$* -test $# -eq 0 && args=dump +test $# -eq 0 && args=show if [ "$(whoami)" != "logtracker" ]; then sudo -H -u logtracker logtracker-manage $args diff --git a/logtracker/journal/forms.py b/logtracker/journal/forms.py index 429ffac..ecc32c1 100644 --- a/logtracker/journal/forms.py +++ b/logtracker/journal/forms.py @@ -1,14 +1,15 @@ import datetime - from django import forms +from django.conf import settings from logtracker.journal.models import Entry class EntriesForm(forms.Form): host = forms.MultipleChoiceField(required=False) _systemd_unit = forms.MultipleChoiceField(required=False) - priority = forms.MultipleChoiceField(required=False, choices=[(i, i) for i in range(1, 7)]) - since = forms.DateTimeField(required=False, initial=datetime.datetime.now()) + priority = forms.ChoiceField(required=False, choices=reversed([(i, i) for i in range(1, 8)])) + since = forms.DateTimeField(required=False, initial=datetime.datetime.now() - datetime.timedelta(days=settings.LOGTRACKER_HISTORY)) + tail = forms.BooleanField(required=False) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/logtracker/journal/management/commands/clean_journal.py b/logtracker/journal/management/commands/clean_journal.py index 8fa6659..ea4bcb7 100644 --- a/logtracker/journal/management/commands/clean_journal.py +++ b/logtracker/journal/management/commands/clean_journal.py @@ -10,7 +10,7 @@ class Command(BaseCommand): help = "Remove old entries" def add_arguments(self, parser): - parser.add_argument("--keep", type=int, default=settings.JOURNAL_HISTORY) + parser.add_argument("--keep", type=int, default=settings.LOGTRACKER_HISTORY) def handle(self, *args, **options): limit = datetime.datetime.now() - datetime.timedelta(days=options['keep']) diff --git a/logtracker/journal/management/commands/dump.py b/logtracker/journal/management/commands/show.py similarity index 57% rename from logtracker/journal/management/commands/dump.py rename to logtracker/journal/management/commands/show.py index 11089ac..deee6ce 100644 --- a/logtracker/journal/management/commands/dump.py +++ b/logtracker/journal/management/commands/show.py @@ -1,8 +1,10 @@ from django.core.management.base import BaseCommand, CommandError from logtracker.journal.models import Entry +from pydoc import pager import os import textwrap + def bold(txt): bold = "\033[1m" end = "\033[0m" @@ -15,17 +17,25 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument("--full", action="store_true") parser.add_argument("--since") - parser.add_argument("-n", "--lines", default=100) - parser.add_argument('options', nargs="*") + parser.add_argument("-n", "--lines", help="tail n lines") + parser.add_argument("-p", "--priority") + parser.add_argument("--no-pager", action="store_true") + parser.add_argument('options', nargs="*", help="any systemd selector k=v") def handle(self, *args, **options): + if options['no_pager'] or options['lines']: + for l in self.get_lines(**options): + print(l) + else: + pager('\n'.join([l for l in self.get_lines(**options)])) + + def get_lines(self, **options): _, columns = os.popen("stty size", "r").read().split() kwargs = {k: v for (k, v) in [o.split('=') for o in options['options']]} - for entry in Entry.objects.dump(lines=options['lines'], since=options['since'], **kwargs): + for entry in Entry.objects.extract(lines=options['lines'], since=options['since'], priority=options['priority'], **kwargs): line = "%s %s %s %s" % ( entry.timestamp.astimezone().strftime("%b %d %X"), - entry.host, - entry.unit, + entry.host, entry.unit, entry.data.get("MESSAGE"), ) priority = entry.data.get("PRIORITY") @@ -33,4 +43,4 @@ class Command(BaseCommand): line = textwrap.shorten(line, int(columns)) if priority and int(priority) < 4: line = bold(line) - print(line) + yield line diff --git a/logtracker/journal/models.py b/logtracker/journal/models.py index 0f97049..9791738 100644 --- a/logtracker/journal/models.py +++ b/logtracker/journal/models.py @@ -10,7 +10,7 @@ from django.utils import timezone class EntryManager(models.Manager): - def dump(self, since=None, host=None, lines=100, **kwargs): + def extract(self, since=None, host=None, lines=None, **kwargs): qs = Entry.objects.all() if since: timestamp = timezone.make_aware(datetime.datetime.strptime(since, "%Y-%m-%d %H:%M:%S")) @@ -18,17 +18,21 @@ class EntryManager(models.Manager): if host: qs = qs.filter(host__in=host) qs = qs.filter(**self.parse_options(**kwargs)) - qs = qs.order_by('timestamp') if lines: - qs = qs[:int(lines)] + qs = qs.order_by('-timestamp') + qs = qs[:int(lines)][::-1] + else: + qs = qs.order_by('timestamp') return qs def parse_options(self, **kwargs): # todo mode='contains' require jsonb KeyTextTransform and probably annotations options = {} for k, v in kwargs.items(): - if k.upper() == 'csrfmiddlewaretoken': + if not v or v == ['']: continue + if k == 'priority': + v = [str(n) for n in range(0, int(v))] options['data__' + k.upper() + '__in'] = v return options diff --git a/logtracker/journal/templates/home.html b/logtracker/journal/templates/home.html index 6fd19b4..830d3c3 100644 --- a/logtracker/journal/templates/home.html +++ b/logtracker/journal/templates/home.html @@ -7,7 +7,7 @@ Journal entries
Logtracker - journal entries
+Logtracker - journal entries : {{ page_obj.paginator.count }} + + + {% if page_obj.has_previous %} + « first + previous + {% endif %} + + + Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}. + + + {% if page_obj.has_next %} + next + last » + {% endif %} + + +