Kategorien
Allgemein

Log-Dateien lesbar machen

Da hatte ich eine tolle Log-Datei mit ganz vielen Einträgen. Aber vi wollte die Datei nicht richtig anzeigen. Das Problem war, dass alle Einträge in einer Zeile standen, da ich die newlines am Ende der Einträge vergessen hatte. Was nun

Schnell ein Perl-Skript geschrieben, dass die Anfänge der Log-Einträge findet und vor diese ein Neues Zeilen Zeichen einfügt.

#!/usr/bin/perl
use strict;
use warnings;

my $days = qr{Mon|Tue|Wed|Thu|Fri|Sat|Sun};
my $months = qr{Jan|Feb|Mar|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec};
my $date_regex = qr{(?:$days)(?:$months) d{2} d{2}:d{2}:d{2} d{4}};

while (my $line = <>) {
   while ($line =~ m/($date_regex.*?(?=$date_regex))/g) {
      print "n$1";
   }
}
Kategorien
Allgemein

Super Fehlermeldungen

Gut formulierte Fehlermeldungen können einem Administrator viel Zeit ersparen. Schlechte kosten im besten Fall nur Nerven.

In meinem letzten Fall hat es mich insgesamt mehrere Tage gekostet. Ganz konkret ging es um den Imap Server von Cyrus. Um dem erhöhten Mailaufkommen beizukommen wollen wir unseren derzeitigen Mailserver (auch von Cyrus) durch eine Cluster-Installation ersetzen. Der letzte Test bestand dann darin, dass der MTA eine Mail über einen Lmtp-Proxy an den eigentlichen Speicherort der Mail weiterreicht.

Das hat er in meiner Testinstallation auch wunderbar gemacht.

In der Produktionsinstallation weigerte er sich mit einer Meldung, dass es keine „worthy mechs“ gäbe. Also keine Mechanismen zur Authentisierung/Authorisierung, mit denen der Proxy mit dem Backend sprechen wollte.

Goggle bietet hier schnell viele Treffer an, die alle in die Richtung TLS Verschlüsselung gehen. Nur die funktionierte bei meiner Installation.

Des Rätsels Lösung lag darin, dass für den Namen des Backends kein Passwort in der Konfiguration des Frontends hinterlegt war.

Tolle Fehlermeldung.

Kategorien
Allgemein

Loggen in Shell Programmen

In Java wird log4j genutzt, in Perl gibt es Log::Log4perl, in Python ist zwar keine 4 im Namen, aber logging tut es ja auch. Für JavaScript gibt es log4js und in Bash gibt es natürlich log4sh. Aber wie immer, kann man das auch einfach selber machen.

Zum Beispiel mit einer einfachen log Funktion:

#!/usr/bin/bash
LOG_DEBUG=0
LOG_INFO=1
LOG_WARN=2
LOG_ERROR=3
LOG_CRITICAL=4
export LOG_DEBUG LOG_INFO LOG_WARN LOG_ERROR LOG_CRITICAL

export LOG_LEVEL=$LOG_WARN
export LOG_FILE="$HOME/simple_log"

function log() {
    local level=shift
    local message=$*

    if [ "$level" -ge "$LOG_LEVEL" ]
    then
        echo "$(date) $message" >> "$LOG_FILE"
    fi
}

Ist dieses Shell Skript in einer Datei – sagen wir simple_log.sh – gespeichert, so kann es in einem anderen Shell-Skript wie folgt genutzt werden:

#!/usr/bin/bash
. simple_log.sh

log $LOG_DEBUG "Am Anfang des Skriptes"
log $LOG_INFO "Und ende."

Aber ehrlich: log4sh ist genauso einfach zu benutzen und kann viel mehr.