Derzeit verwende ich tail -f
zum Anzeigen von Protokollen.
Gibt es eine effizientere/lesbarere/bessere Möglichkeit, Protokolle anzuzeigen?
Antwort1
Ja! perl
stehe fürPraktische Extraktions- und Forschungssprache.
Verwenden Sie anstelle von shell
Syntaxen wie:
tail -f file | grep --line-buffered someting
oder
tail -f file | sed -une '/someting/{s/^.*:/doing some formatting/;p}'
(Nota: --line-buffered
in grep
, wie -u
in sed
sind nützlich, um zu verhindernPufferung durch Blöcke fester Größe)
Zum Anzeigen/Durchsuchen von Protokollen perl
istDieSprache.
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 perlfaq5
wenn 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 ~/.bashrc
die 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'
}
-p
: bindet das Skript in eine Schleife ein und gibt die verarbeitete Zeile aus-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)31
bedeutet roter Vordergrund43
bedeutet gelber Hintergrund1
ermöglicht Fettschriftm
schließt Escape-Sequenz$1
beinhaltet die Eingabezeile\033[0m
ist eine zweite Sequenz, um die Standardformatierung wieder auf den Standard zurückzusetzen, nachdem die Zeile ausgegeben wurde\007
Pieptöne
-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:31
bedeutet gelb Vordergrund43
bedeutet 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:
perl -p
Befehl- Textformatierungin der Schale
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.