Neues Feature von check_logfiles: Teilausdrücke gruppieren

Reguläre Ausdrücke in Perl erlauben die Bildung von Teilausdrücken. Mit runden Klammern kann man bestimmte Abschnitte eines Ausdrucks zusammenfassen, um sie an anderer Stelle oder nach dem Mustervergleich weiterzuverwenden.

$line =~ /Fatal: error (\d+) occured/;
$errorcode = $1;

Bei check_logfiles kann dies benutzt werden, um aus Trefferzeilen die relevanten Teilstrings zu extrahieren und so die Ausgabe des Plugins zu verkürzen.

Ein Kunde wollte bei Ergebniszeilen folgender Art keine entsprechend lange Meldung erhalten:

Jan  8 07:23:23 tp23w24m3 et_syslog[5476]: E|NOKEY|Jan  8 07:23:23 2014|etlog.log.app.EVSQueueSvr.12|12|af13w34k1|    5476|det     |init_sql.cp|195|Embedded sql error from file DB_Dequeue line 2769,  node PRTRPS2A101M3 db PRA_OrdQueueDB , sqlerrcode -1204, 1 of 1 - "ASE has run out of LOCKS. Re-run your command when there are fewer active users, or contact a user with System Administrator (S”|5476.0012

Sein Vorschlag war, in den criticalpatterns durch Gruppierung mit runden Klammern die für ihn wichtigen Informationen herauszuziehen und die Trefferzeilen on-the-fly in Kurzform umzuschreiben.

Statt

criticalpatterns => [
    ....
    '.*ASE has run out of LOCKS.*',
],

heisst es nun

criticalpatterns => [
    ....
    'node (.*) db (.*) .*(ASE has run out of LOCKS).*',
],
options => 'supersmartscript,capturegroups',
script => sub {
    printf '%s@%s: %s\n',
        $ENV{CHECK_LOGFILES_CAPTURE_GROUP2},
        $ENV{CHECK_LOGFILES_CAPTURE_GROUP1},
        $ENV{CHECK_LOGFILES_CAPTURE_GROUP3};
    return 2;
},

Damit nimmt obige Trefferzeile den Wert "PRA_OrdQueueDB@PRTRPS2A101M3: ASE has run out of LOCKS" an, so als hätte sie von Anfang an (also im Logfile) als diese Kurzfassung existiert und wäre so von check_logfiles gefunden worden. Die Perl-Variablen $1, $2 etc. liegen im Handlerscript als Environmentvariablen $ENV{CHECK_LOGFILES_CAPTURE_GROUPn} vor. Da dieses Feature eine kleine Performanceeinbusse mit sich bringen kann (welche aber erst bei Suchläufen über tausende von Zeilen relevant ist), muss sie explizit mit der Option capturegroups eingeschaltet werden.