Effiziente Umgebung zum Anzeigen von Protokollen

Effiziente Umgebung zum Anzeigen von Protokollen

Derzeit verwende ich tail -fzum Anzeigen von Protokollen.

Gibt es eine effizientere/lesbarere/bessere Möglichkeit, Protokolle anzuzeigen?

Antwort1

Ja! perlstehe fürPraktische Extraktions- und Forschungssprache.

Verwenden Sie anstelle von shellSyntaxen wie:

tail -f file | grep --line-buffered someting

oder

tail -f file | sed -une '/someting/{s/^.*:/doing some formatting/;p}'

(Nota: --line-bufferedin grep, wie -uin sedsind nützlich, um zu verhindernPufferung durch Blöcke fester Größe)

Zum Anzeigen/Durchsuchen von Protokollen perlistDieSprache.

Es hängt davon abworauf Sie warten ...Möglicherweise müssen Sie ein kleines Skript erstellen, um es genau Ihren Anforderungen anzupassen.

Möglicherweise finden Sie in perlfaq einige brauchbare Beispiele, beispielsweise in perldoc perlfaq5(oder man perlfaq5wenn Sie es nicht installiert haben perldoc), gibt es eine Frage:Wie mache ich ein „tail -f“ in Perl?wo ich das hier aufgenommen habe:

Erster Versuch

seek(GWFILE, 0, 1);

Die Anweisung seek(GWFILE, 0, 1)ändert nicht die aktuelle Position, löscht jedoch die Dateiende-Bedingung des Handles, sodass <GWFILE>Perl bei der nächsten Anweisung erneut versucht, etwas zu lesen.

Wenn das nicht funktioniert (es hängt von den Funktionen Ihrer Stdio-Implementierung ab), brauchen Sie eher etwas wie das hier:

for (;;) {
    for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) {
      # search for some stuff and put it into files
    }
    # sleep for a while
    seek(GWFILE, $curpos, 0);  # seek to where we had been
  }

Ich habe dies bereits oft zum Auslösen von Sonderfällen verwendet.

DEMO

Als Beispiel gibt es einequick and dirty Echtzeit-Logzählerprobier es aus! (brauche Lesezugriff auf /var/log/syslog;-) :

#!/usr/bin/perl -w
my %counter;

open FH, "</var/log/syslog" or die;
my $curpos = ( stat FH )[7];
seek( FH, $curpos, 0 );

for ( ; ; ) {
    for ( $curpos = tell(FH) ; <FH> ; $curpos = tell(FH) ) {
        $counter{$3}++ if /^(\S+\s+){4}(\S+\/|)([^\/\[:]*)[\[:]/;
    }
    syswrite STDOUT, sprintf "\r%s\e[K",
      join( ", ", map { sprintf "%s:%s", $_, $counter{$_} } keys %counter );
    select undef,undef,undef,1;
    seek( FH, $curpos, 0 );
}

Würde eine Zeile erzeugen, die sich jede Sekunde selbst aktualisiert und alle gesehenenDaemonDer Name und der Zähler für jeden von ihnen:

smtp:6, pop3d-ssl:13, local:6, imapd:8, smtpd:30, CRON:5, pickup:1, named:1

Antwort2

Wie F. Hauri vorschlägt, könnten Sie Perl zum Formatieren der Ausgabe verwenden.

Für meinen Einsatzzweck habe ich einen Alias ​​für tail erstellt, um ~/.bashrcdie Logs von Glassfish zu lesen. Er ist sehr einfach (eine Zeile) und färbt meine Ausgabe ein, um Fehler-/Warnzeilen hervorzuheben:

tail-color() {
    tail $* | perl -p -e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;' -e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;' -e 's/(.*SEVERE.*)/\033[33;41;1m$1\033[0m\007/g'
}
  1. -p: bindet das Skript in eine Schleife ein und gibt die verarbeitete Zeile aus
  2. -e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;'färbt jede Zeile, die "WARN" enthält
    • \033[beginnt mit der Escape-Sequenz (ermöglicht die Formatierung)
    • 31bedeutet roter Vordergrund
    • 43bedeutet gelber Hintergrund
    • 1ermöglicht Fettschrift
    • mschließt Escape-Sequenz
    • $1beinhaltet die Eingabezeile
    • \033[0mist eine zweite Sequenz, um die Standardformatierung wieder auf den Standard zurückzusetzen, nachdem die Zeile ausgegeben wurde
    • \007Pieptöne
  3. -e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;'färbt jede Zeile, die "ERROR" enthält; die einzigen Unterschiede betreffen die Farben:
    • 31bedeutet gelb Vordergrund
    • 43bedeutet roter Hintergrund

In meinem Fall habe ich die visuelle Glocke eingeschaltet, sodass mein Bildschirm bei einem Fehler blinkt (und mein Lautsprecher nicht piept) und Fehler-/Warnzeilen sehr schnell erkannt werden können.

Sie erhalten weitere Informationen über:

Wie F. Hauri in seiner Antwort erklärt, können Sie dank Perl viele Dinge tun, sodass Sie je nach Bedarf Ihren eigenen Protokollleser „entwickeln“ können.

verwandte Informationen