Beispiel 1: Fehlermeldungen von FCAL-Devices

Einsatz als Nagios-Plugin zur Überwachung von FCAL-Devices an einem Solaris-System. Dies ist eine einfache Anwendung, die lediglich nach einigen Patterns in /var/adm/messages sucht.

@searches = (
  {
    tag => 'san',
    logfile => '/var/adm/messages',
    rotation => 'SOLARIS',
    criticalpatterns => [
        'Link Down Event received',
        'Loop OFFLINE',
        'fctl:.*disappeared from fabric',
        '.*Lun.*disappeared.*'
    ],
  });

Beispiel 2: Nochmal, aber diesmal als passiver Service mit send_nsca

Mit dem folgenden Konfigfile kann check_logfiles als Stand-Alone-Script aufgerufen werden (z.b. per Cronjob). Falls die genannten Fehlermeldungen in der Messages-Datei auftauchen, wird am Ende der Laufzeit von check_logfiles eine zusammenfassende Meldung per send_nsca an einen NSCA-Server geschickt.

$scriptpath = '/usr/bin/nagios/libexec:/usr/local/nagios/contrib';
$MACROS = {
    NAGIOS_HOSTNAME => 'orschgeign.muc',
    CL_NSCA_HOST_ADDRESS => 'nagios1.muc',
    CL_NSCA_PORT => 5778
};
$postscript = 'send_nsca';
$postscriptparams = '-H $CL_NSCA_HOST_ADDRESS$ -p $CL_NSCA_PORT$
     -to $CL_NSCA_TO_SEC$ -c $CL_NSCA_CONFIG_FILE$';
$postscriptstdin = '$CL_HOSTNAME$\t$CL_SERVICEDESC$\t
    $CL_SERVICESTATEID$\t$CL_SERVICEOUTPUT$\n';

@searches = (
  {
    tag => 'san',
    logfile => '/var/adm/messages',
    criticalpatterns => [
        'Link Down Event received',
        'Loop OFFLINE',
        'fctl:.*disappeared from fabric',
        '.*Lun.*disappeared.*'
    ],
  },
);

Beispiel 3: Nochmal, aber diesmal mit Versand der Einzeltreffer

Soll jedesmal, wenn eine Zeile mit kritischem Inhalt erkannt wurde, eine eigene Meldung per NSCA versandt werden, dann kommen folgende Modifikationen zum Einsatz. Es ist jedoch zu beachten, das womöglich Hunderte von Fehlermeldungen in die Messages-Datei geschrieben wurden, die einen entsprechenden Event-Sturm verursachen.

$scriptpath = '/usr/bin/nagios/libexec:/usr/local/nagios/contrib';
$MACROS = {
    NAGIOS_HOSTNAME => 'orschgeign.muc',
    CL_NSCA_HOST_ADDRESS => 'nagios1.muc',
    CL_NSCA_PORT => 5778
};

@searches = (
  {
    tag => 'san',
    logfile => '/var/adm/messages',
    criticalpatterns => [
        'Link Down Event received',
        'Loop OFFLINE',
        'fctl:.*disappeared from fabric',
        '.*Lun.*disappeared.*'
    ],
    options => 'script',
    script => 'send_nsca',
    scriptparams => '-H $CL_NSCA_HOST_ADDRESS$ -p $CL_NSCA_PORT$
     -to $CL_NSCA_TO_SEC$ -c $CL_NSCA_CONFIG_FILE$',
    scriptstdin => '$CL_HOSTNAME$\t$CL_SERVICEDESC$\t
    $CL_SERVICESTATEID$\t$CL_SERVICEOUTPUT$\n',
  },
);

Beispiel 4: Funktion des Syslog-Service prüfen

Im folgenden Beispiel wird beim Start des Plugins mittels des logger-Kommandos eine Meldung an den Syslog-Daemon geschickt. Nach einer kurzen Verzögerung von 5 Sekunden (welche dem syslogd ausreichend Zeit lässt, die Meldung in die Messages-Datei zu schreiben) wird nach dieser Meldung gesucht und, sollte diese nicht zu finden sein, ein Alarm ausgelöst.

$scriptpath = '/usr/bin';
$prescript = 'logger';
$prescriptparams = '-t nagios';
$prescriptstdin = 'braver syslog ($CL_DATE_YYYY$-$CL_DATE_MM$
    -$CL_DATE_DD$ $CL_
DATE_HH$:$CL_DATE_MI$:$CL_DATE_SS$)';
$prescriptsleep = 5;

@searches = (
  {
    tag => 'syslogworks',
    logfile => '/var/adm/syslog/syslog.log',
    rotation => 'bmwhpux',
    criticalpatterns => ['!nagios:\s+braver\s+syslog'],
    options => 'count',
  },
);

Beispiel 5: Überwachung von HP ServiceGuard

Hier wird nach typischen Fehlermeldungen des Clusters gesucht. Der Wert HPUX des rotation-Parameters sorgt dafür, daß syslog.log und eventuell OLDsyslog.log durchsucht werden.

$seekfilesdir = '/lfs/opt/nagios/var/tmp';
$protocolsdir = '/lfs/opt/nagios/var/tmp';
$scriptpath = '/lfs/opt/nagios/nrpe/locallibexec';
@searches = (
  {
    tag => 'mcsg',
    logfile => '/var/adm/syslog/syslog.log',
    rotation => 'HPUX',
    criticalpatterns => [
        '.*cmcld: Inbound connection from unconfigured address.*',
        '.*cmclconfd.*Unable to activate keep alive option on
     incomming connection.*',
        '.*inetd.*hacl-cfg/udp: Server failing (looping),
     service terminated.*',
        '.*inetd.*hacl-probe/tcp: accept: Bad file number.*',
        '.*cmcld: Inbound.*message from unconfigured address.*',
        '.*cmcld: Unable to connect to quorum server .*
     It may be down.*',
        '.*cmcld: Failed to receive from quorum server.*',
        '.*cmcld: Connection failure to quorum server.*'
    ],
    warningpatterns => [
        'Cluster Files not in Sync',
    ],
    options => 'protocol,count'
  },
);

Beispiel 6: Überwachung von LVM unter HP-UX

Im folgenden Beispiel werden typische Fehlermeldungen von LVM gesucht.

@searches = (
 {
  tag => 'lvm',
  logfile => '/var/adm/syslog/syslog.log',
  rotation => 'HPUX',
  criticalpatterns => [
   '.*vmunix: LVM: vg\[[0-9]*\]: pvnum=.*is POWERFAILED',
   '.*vmunix: SCSI: Read error.*dev:.*errno:.*resid:.*',
   '.*vmunix: LVM:.*PVLink.* Failed! The PV is still accessible.*',
   '.*vmunix: LVM: Restored PV.*',
   '.*vmunix: LVM: Performed a switch for Lun ID.*',
   '.*vmunix: LVM:.*PVLink.*Recovered.*',
   '.*vmunix:.*vxfs:.*vx_metaioerr.*file system meta data read error',
  ],
 },
);

Beispiel 7: Einfache Überwachung der Hardware von SUN-Servern

Wenn man unter Solaris das Kommando prtdiag mit der Option -l aufruft, dann werden eventuelle Meldungen bzgl. defekter Hardware an Syslog geschickt. In diesem Beispiel wird zuerst prtdiag wie beschrieben aufgerufen. Wird anschliessend eine entsprechende Meldung in der Messages-Datei gefunden, dann bedeutet dies, daß ein Defekt festgestellt wurde.

#
#  This config file implements a simple method to monitor the
#  hardware health of a solaris machine.
#  From the prtdiag(1M) manpage:
#  -l    Log output. If failures or errors exist in the system,
#        output this information to syslogd(1M) only.
#  This means, if you run prtdiag and you find something
#  prtdiag-related in the messages file, then there must be
#  an error somewhere in the system.
#
$scriptpath = '/usr/platform/sun4u/sbin';
$prescript = 'prtdiag';
$prescriptparams = '-l';
@searches = (
  {
    tag => 'prtdiag',
    logfile => '/var/adm/messages',
    rotation => 'SOLARIS',
    criticalpatterns => 'prtdiag:',
  },
);

Beispiel 8: Überwachung der Hardware von SUN-Servern mit Versand von SNMP-Traps

Im folgenden Beispiel wird die /var/adm/messages nach Meldungen durchsucht, die auf Speicherfehler hinweisen. Check_logfiles läuft in diesem Szenario nicht als Nagios-Plugin, sondern als Stand-Alone-Programm, welches im Fehlerfall einen SNMP-Trap verschickt. Dazu wird das Script send_snmptrap.pl aufgerufen, welches die nötigen Informationen in Form von Environmentvariablen übergeben bekommt. Hier wird im Fehlerfall nur ein einziger Trap versandt, nämlich am Programmende. Möchte man einzelne Traps für jede der gefundenen Fehlermeldungen, so gibt man statt des “$postscript” in der Definitiion des Search ein “script” an.

$MACROS = {
  SNMP_TRAP_SINK_HOST => 'nagios.dierichs.de',
  SNMP_TRAP_SINK_VERSION => 'snmpv1',
  SNMP_TRAP_SINK_COMMUNITY => 'public',
  SNMP_TRAP_SINK_PORT => 162,
  SNMP_TRAP_ENTERPRISE_OID => '1.3.6.1.4.1.20006.1.5.1',
};
$seekfilesdir = '/lfs/opt/nagios/var/tmp';
$protocolsdir = '/lfs/opt/nagios/var/tmp';
$scriptpath = '/lfs/opt/nagios/nrpe/locallibexec';
@searches = (
 {
  tag => 'hwmsgs',
  logfile => '/var/adm/kern.log',
  rotation => 'kern\d{4}-\d{2}-\d{2}',
  criticalpatterns => [
  # bitfehler kann vom scrubber nicht repariert werden.
  # gleich krachts.
  '.*Sticky Softerror encountered.*',
  ],
  warningpatterns => [
   # speicher broeselt
   'NOTICE: Previously reported error on page \w+\.\w+ cleared',
   # netwerkkabel wurde gezogen
   'WARNING: \w+: fault detected external to device; service degraded',
  ],
  options => 'noprotocol',
 },
);
$postscript => 'send_snmptrap.pl';

Jörg Linge hat dazu freundlicherweise folgendes Script zur Verfügung gestellt:

#! /usr/bin/perl
#
#  send_snmptrap.pl
#
use strict;
use Net::SNMP;

my $hostname = $ENV{CHECK_LOGFILES_SNMP_TRAP_SINK_HOST}
    || 'nagios.dierichs.de';
my $version = $ENV{CHECK_LOGFILES_SNMP_TRAP_SINK_VERSION}
    || 'snmpv1';
my $community = $ENV{CHECK_LOGFILES_SNMP_TRAP_SINK_COMMUNITY}
    || 'public';
my $port = $ENV{CHECK_LOGFILES_SNMP_TRAP_SINK_PORT}
    || 162;
my $oid = $ENV{CHECK_LOGFILES_SNMP_TRAP_ENTERPRISE_OID}
    || '1.3.6.1.4.1.20006.1.5.1';


my ($session, $error) = Net::SNMP->session(
    -hostname     => $hostname,
    -version      => $version,
    -community    => $community,
    -port         => $port      # Need to use port 162
);
if (!defined($session)) {
   printf('ERROR: %s.\n', $error);
   exit 1;
}
my @varbind = ($oid, OCTET_STRING, $ENV{CHECK_LOGFILES_SERVICEOUTPUT});
my $result = $session->trap(
    -enterprise   => $oid,
    -specifictrap => $ENV{CHECK_LOGFILES_SERVICESTATEID},
    -varbindlist  => \@varbind);
$session->close;
exit 0;

Beispiel 9: Überwachung der Hardware von SUN-Servern mit Alarmierung per NSCA

Anstelle von SNMP-Traps können Fehlermeldungen auch per send_nsca an den Nagios-Server gemeldet werden. Auch hier läuft check_logfiles als Stand-Alone-Programm.

$scriptpath = '/usr/local/nagios/bin';
$MACROS = {
    NAGIOS_HOSTNAME => 'orschgeign.muc',
    CL_NSCA_HOST_ADDRESS => 'nagios1.muc',
    CL_NSCA_PORT => 5778,
    CL_NSCA_CONFIG_FILE => '/usr/local/etc/send_nsca.cfg',
};
@searches = (
 {
  tag => 'hwmsgs',
  logfile => '/var/adm/kern.log',
  rotation => 'kern\d{4}-\d{2}-\d{2}',
  criticalpatterns => [
  # bitfehler kann vom scrubber nicht repariert werden.
  # gleich krachts.
  '.*Sticky Softerror encountered.*',
  ],
  warningpatterns => [
   # speicher broeselt
   'NOTICE: Previously reported error on page \w+\.\w+ cleared',
   # netwerkkabel wurde gezogen
   'WARNING: \w+: fault detected external to device; service degraded',
  ],
  options => 'noprotocol',
 },
);
$postscript = 'send_nsca';
$postscriptparams = '-H $CL_NSCA_HOST_ADDRESS$ -p $CL_NSCA_PORT$
     -to $CL_NSCA_TO_SEC$ -c $CL_NSCA_CONFIG_FILE$';
$postscriptstdin = '$CL_HOSTNAME$\t$CL_SERVICEDESC$\t
    $CL_SERVICESTATEID$\t$CL_SERVICEOUTPUT$\n';

Beispiel 10: Linux-Logfiles als unprivilegierter User lesen.

Beim Start von check_logfiles werden die Rechte der Logfiles so erweitert, daß sie vom Nagios-User gelesen werden dürfen. Dazu ist noch ein Eintrag in /etc/sudoers nötig:

qqnagio ALL = (root) NOPASSWD: /usr/bin/setfacl

Sollte das sudo-Kommando fehlschlagen, dann sorgt sein Exitcode von 1 zusammen mit der Option supersmartprescript dafür, daß check_logfiles mit einer Warnung abbricht.

Falls in /etc/sudoers die Zeile

Defaults requiretty

steht, muss diese auskommentiert werden.

$scriptpath = '/usr/bin';
$prescript = 'sudo';
$prescriptparams = 'setfacl -m u:$CL_USERNAME$:r-- /var/log/messages*';
$options = 'supersmartprescript';
@searches = ({
  tag => 'reiserfs',
  logfile => '/var/log/messages',
  rotation => 'SUSE',
  criticalpatterns => [
     'vs-5150: search_by_key:',
     'is_tree_node: node level \d+ does not match to the expected one',
     'vs-500: unknown uniqueness -1',
     'vs-5657: reiserfs_do_truncate: i/o failure',
     'green-16006: Invalid item type observed, run fsck ASAP'],
  ...
});
....

Beispiel 11: Apache unter Windows auf Einbruchsspuren überwachen

Bei der Verwendung unter Windows ist darauf zu achten, daß Pfadangaben wegen der ‘' in einfache Hochkommata zu setzen sind.

$MACROS = {
  APACHEDIR => 'C:\Programme\Apache Software Foundation\Apache2.2'
};
@searches = ({
  tag => 'apachebreakin',
  logfile => '$APACHEDIR$\logs\access.log',
  criticalpatterns => [
      'GET.*cmd\.exe.*',
      'SEARCH /\\x90\\x02\\xb1\\x02\\xb1' ]
});

Beispiel 12: Treffer mit Hilfe eines Scripts rückgängig machen

Scripts mit der Eigenschaft “supersmart” können helfen, Treffer in der Logdatei genauer zu untersuchen und gegebenfalls nachträglich zu ändern.

@searches =(
  {
    tag => 'heiss',
    logfile => '/var/log/messages',
    criticalpatterns => '.*Thermometer: \d+ Grad.*',
    options => 'supersmartscript',
    script => sub {
      my $grad = 0;
      $ENV{CHECK_LOGFILES_SERVICEOUTPUT} =~ /: (\d+) Grad/;
      $grad = $1;
      if ($grad > 30) {
        if (($ENV{CHECK_LOGFILES_DATE_MM} >= 6) &&
            ($ENV{CHECK_LOGFILES_DATE_MM} <= 8)) {
          printf 'OK - ist ja schliesslich Sommer\n';
          return 0; # Dieser Treffer hat somit niemals existiert.
        } elsif (($ENV{CHECK_LOGFILES_DATE_MM} >= 11) &&
            ($ENV{CHECK_LOGFILES_DATE_MM} <= 2)) {
          printf 'CRITICAL - es brennt!\n';
          return 2;
        } else {
          printf 'WARNING - bisschen warm hier drin\n';
          return 1;
        }
      } else {
        printf 'OK - unter 30 Grad\n';
        return 0;
      }
    }
  }
);

Mit dem Typ “virtual” lassen sich Dateien im /proc- oder /sys-Verzeichnis überwachen. Im folgenden Beispiel wird von einem Emulex LPe1150 Adapter das Kabel abgezogen.

nagios@ibmsrv05:/> cat /sys/class/scsi_host/host0/model
ServeRAID 8i
nagios@ibmsrv05:/> cat /sys/class/scsi_host/host1/modeldesc
Emulex LPe1150-F4 4Gb 1port FC: PCIe SFF HBA
nagios@ibmsrv05:/> cat /sys/class/scsi_host/host2/modeldesc
Emulex LPe1150-F4 4Gb 1port FC: PCIe SFF HBA
.
.
.
nagios@ibmsrv05:/> cat /sys/class/scsi_host/host0/state
running
nagios@ibmsrv05:/> cat /sys/class/scsi_host/host1/state
Link Up - Ready:
   Fabric
nagios@ibmsrv05:/> cat /sys/class/scsi_host/host2/state
Link Up - Ready:
   Fabric
.
.
.
@searches = (
  {
    tag => 'host0',
    logfile => '/sys/class/scsi_host/host0/state',
    type => 'virtual',
    criticalpatterns => [
      '^[^running]+'
    ],
    options => 'nologfilenocry,noprotocol',
  },
  {
    tag => 'host1',
    logfile => '/sys/class/scsi_host/host1/state',
    type => 'virtual',
    criticalpatterns => [
      'Link [^Up]+'
    ],
    options => 'nologfilenocry,noprotocol',
  },
  {
    tag => 'host2',
    logfile => '/sys/class/scsi_host/host2/state',
    type => 'virtual',
    criticalpatterns => [
      'Link [^Up]+'
    ],
    options => 'nologfilenocry,noprotocol',
  },
);
.
.
.
nagios@ibmsrv05:/> check_logfiles -f linux_fs_check_fcal.cfg
OK - no errors or warnings |host0=1;0;0;0 host1=2;0;0;0 host2=2;0;0;0
.
.
.
nagios@ibmsrv05:/> cat /sys/class/scsi_host/host2/state
Link Down
.
.
.
nagios@ibmsrv05:/> check_logfiles -f linux_fs_check_fcal.cfg
CRITICAL - (1 errors) - Link Down  |host0_lines=1
     host0_warnings=0 host0_criticals=0
     host0_unknowns=0 host1_lines=2 host1_warnings=0
     host1_criticals=0 host1_unknowns=0 host2_lines=1
     host2_warnings=0 host2_criticals=1 host2_unknowns=0

Beispiel 14: Weiterleitung des Eventlogs von Windows-Servern zu einem Unix-Syslogserver

Wenn in den Syslogmessages Meldungen von vielen Servern vorkommen, weil die Eventlogs aller Windows-Server an einen Syslogserver geleitet werden, dann kann mit der syslogclient-Option gezielt nach den Meldungen eines bestimmten Windows-Servers gesucht werden.

@searches = ({
  tag => 'exchange1.dom',
  logfile => '/var/log/messages',
  rotation => 'SUSE',
  criticalpatterns => [
     'An MTA database server error was encountered',
  ],
  options => 'syslogclient=exchange1.dom'
},
{
  tag => 'exchange2.dom',
  logfile => '/var/log/messages',
  rotation => 'SUSE',
  criticalpatterns => [
     'An MTA database server error was encountered',
  ],
  options => 'syslogclient=$CL_TAG$'
  });
....

Beispiel 15: Durchsuchen des AIX Errpt

AIX schreibt viele Fehlermeldungen in den sog. Error Report, der mit dem errpt-Kommando ausgelesen werden kann. Mit type=errpt kann man check_logfiles anweisen, anstelle einer Logdatei die Ausgabe dieses Kommandos zu durchsuchen.

@searches = (
 {
   tag => 'minor_errors',
   type => 'errpt',
   criticalpatterns => ['ADAPTER ERROR',
       'The largest dump device is too small.',
       'The copy directory is too small.',
       'Kernel heap use exceeds allocation count',
       'Kernel heap use exceeds percentage thres',
       'LINK ERROR',
       'Permanent fatal error',
       'SCSI BUS OR DEVICE ERROR',
       'SCSI DEVICE OR MEDIA ERROR',
       'Possible malfunction on local adapter',
       'ETHERNET DOWN',
       'UNABLE TO ALLOCATE SPACE IN KERNEL HEAP'
    ],
 }
);

Beispiel 16: Weiterleitung von EventLogs mit Templates

Wenn in einer Logdatei Meldungen verschiedenster Syslog-Clients landen, dann ist es möglich, nur die von einem Client stammenden Meldungen in einem Lauf von check_logfiles zu betrachten. Man benutzt dazu die Option syslogclient. Deren Wert ist der Hostname, der zur Vorfilterung der Logdatei verwendet wird.

define command {
  command_name  check_client_logs
  command_line     $USER2$/check_logfiles --tag=$HOSTNAME$ \
      --logfile='/var/log/messages' \
      --criticalpattern='$ARG1$' --syslogclient='$CL_TAG$'
}
define service {
  service_description dr_watson
  host_name  pc0815.muc
  check_command check_client_logs!4097.*generated an application error
}

Mit Templates ist es möglich, mehrere Suchaufträge in einer Konfigurationsdatei zu formulieren und je nach Host-Typ einzelne daraus zu selektieren. Ansonsten müsste man für jeden Client eine eigene Search-Definition schreiben.

@searches = (
{
  template => 'drwatson',
  logfile => '/var/log/messages',
  criticalpattern => '4097.*generated an application error',
  options => 'syslogclient=$CL_TAG$'
},
{
  template => 'virus',
  logfile => '/var/log/messages',
  criticalpattern => 'a virus was found',
  options => 'syslogclient=$CL_TAG$'
},
{
  template => 'cluster',
  logfile => '/var/log/messages',
  criticalpatterns => ['5029.*The cluster  log is corrupt',
      '5038.*A cluster resource failed', ],
  options => 'syslogclient=$CL_TAG$'
});

Für “normale” Windows-Clients würde man dann aufrufen:

check_logfiles -f <configdatei> --tag='pc0815' \
    --selectedsearches='drwatson,virus' \

Und für Cluster-Server:

check_logfiles -f <configdatei> --tag='clustsrv1.muc'

Beispiel 17: Oracle Alertlog

Oracle Datenbanken schreiben Fehlermeldungen in ein Alertlog. Die Beachtung dieser Meldungen hilft, schwerwiegende Probleme frühzeitig zu erkennen. (Siehe auch type => “oraclealertlog”)

@searches = ({
  tag => 'oraalerts',
  logfile => '......../alert.log',
  criticalpatterns => [
      'ORA\-0*204[^\d]',        # error in reading control file
      'ORA\-0*206[^\d]',        # error in writing control file
      'ORA\-0*210[^\d]',        # cannot open control file
      'ORA\-0*257[^\d]',        # archiver is stuck
      'ORA\-0*333[^\d]',        # redo log read error
      'ORA\-0*345[^\d]',        # redo log write error
      'ORA\-0*4[4-7][0-9][^\d]',# ORA-0440 - ORA-0485 background process failure
      'ORA\-0*48[0-5][^\d]',
      'ORA\-0*6[0-3][0-9][^\d]',# ORA-6000 - ORA-0639 internal errors
      'ORA\-0*1114[^\d]',        # datafile I/O write error
      'ORA\-0*1115[^\d]',        # datafile I/O read error
      'ORA\-0*1116[^\d]',        # cannot open datafile
      'ORA\-0*1118[^\d]',        # cannot add a data file
      'ORA\-0*1122[^\d]',       # database file 16 failed verification check
      'ORA\-0*1171[^\d]',       # datafile 16 going offline due to error advancing checkpoint
      'ORA\-0*1201[^\d]',       # file 16 header failed to write correctly
      'ORA\-0*1208[^\d]',       # data file is an old version - not accessing current version
      'ORA\-0*1578[^\d]',        # data block corruption
      'ORA\-0*1135[^\d]',        # file accessed for query is offline
      'ORA\-0*1547[^\d]',        # tablespace is full
      'ORA\-0*1555[^\d]',        # snapshot too old
      'ORA\-0*1562[^\d]',        # failed to extend rollback segment
      'ORA\-0*162[89][^\d]',     # ORA-1628 - ORA-1632 maximum extents exceeded
      'ORA\-0*163[0-2][^\d]',
      'ORA\-0*165[0-6][^\d]',    # ORA-1650 - ORA-1656 tablespace is full
      'ORA\-16014[^\d]',      # log cannot be archived, no available destinations
      'ORA\-16038[^\d]',      # log cannot be archived
      'ORA\-19502[^\d]',      # write error on datafile
      'ORA\-27063[^\d]',         # number of bytes read/written is incorrect
      'ORA\-0*4031[^\d]',        # out of shared memory.
      'No space left on device',
      'Archival Error',
  ],
  warningpatterns => [
      'ORA\-0*3113[^\d]',        # end of file on communication channel
      'ORA\-0*6501[^\d]',         # PL/SQL internal error
      'ORA\-0*1140[^\d]',         # follows WARNING: datafile #20 was not in online backup mode
      'Archival stopped, error occurred. Will continue retrying',
  ]
});

Beispiel 17a: Oracle RAC Clusterware Alertlog

Von Daniel Graef stammt dieses Beispiel zur Überwachung des Alertlog der Oracle Clusterware. Vielen Dank!

@searches = (
{
  tag => 'racnode01-clusterware',
  logfile => '/oracle/app/crs/product/111_1/log/racnode01/alertracnode01.log',
  criticalpatterns => [
      'CRS\-1006[^\d]', # The OCR location %s is inaccessible. Details in %s.
      'CRS\-1008[^\d]', #  Node %s is not responding to OCR requests. Details in %s.
      'CRS\-1009[^\d]', #  The OCR configuration is invalid. Details in %s.
      'CRS\-1011[^\d]', #  OCR cannot determine that the OCR content contains the latest updates. Details in %s.
      'CRS\-1202[^\d]', #  CRSD aborted on node %s. Error [%s]. Details in %s.
      'CRS\-1203[^\d]', #  Failover failed for the CRS resource %s. Details in %s.
      'CRS\-1205[^\d]', #  Auto-start failed for the CRS resource %s. Details in %s.
      'CRS\-1206[^\d]', #  Resource %s went into an UNKNOWN state. Force stop the resource using the crs_stop -f command and restart %s.
      'CRS\-1207[^\d]', #  There are no more restart attempts left for resource %s. Restart the resource manually using the crs_start command.
      'CRS\-1402[^\d]', #  EVMD aborted on node %s. Error [%s]. Details in %s.
      'CRS\-1602[^\d]', #  CSSD aborted on node %s. Error [%s]. Details in %s.
      'CRS\-1606[^\d]', #  CSSD Insufficient voting files available [%s of %s]. Details in %s.
      'CRS\-1608[^\d]', #  CSSD Evicted by node %s. Details in %s.  [local node eviced, critical for node himself]
      'CRS\-1609[^\d]', #  CSSD detected a network split. Details in %s.
  ],
  warningpatterns => [
      'CRS\-1010[^\d]', #  The OCR mirror location %s was removed.
      'CRS\-1604[^\d]', #  CSSD voting file is offline: %s. Details in %s.
      'CRS\-1607[^\d]', #  CSSD evicting node %s. Details in %s. [local evicted other node, warning for clsuter state]
      'CRS\-2001[^\d]', #  memory allocation error when initiating the connection failed to allocate memory for the connection with the target process
      'CRS\-2003[^\d]', #  error %d encountered when connecting to %s
      'CRS\-2004 [^\d]', # error %d encountered when sending messages to %s
      'CRS\-2005[^\d]', #  timed out when waiting for response from %d
      'CRS\-2006[^\d]', #  failed to get response from %d
  ],
  options => 'sticky=86400'
});

Beispiel 18: IPMI System Event Log

In diesem Beispiel wird nach Problemen mit Stromversorgungen gesucht. (ipmitool sdr zeigt u.U. nicht an, wenn ein Stromkabel gezogen wurde, deshalb sucht man im SEL).

@searches = (
  {
    tag => 'powercable',
    type => 'ipmitool',
    ipmitool => { # you don't need this if you are root
      path => 'sudo /usr/bin/ipmitool',
    },
    criticalpatterns => [
        'Power Supply.*Failure detected',
        'Power Supply AC lost',
     ],
  });
nagios@ibmsrv05:/> check_logfiles -f ibm_power.cfg
CRITICAL - (6 errors in test.protocol-2008-02-12-14-19-36) -
      190 ; 02/07/2008 ; 14:28:13 ; Power Supply #0x39 ;
     Failure detected ...|
     powercable_lines=17 powercable_warnings=0
     powercable_criticals=6 powercable_unknowns=0

Beispiel 19: Passive Checkergebnisse, die nicht zugeordnet werden können

Passive Checkergebnisse, die keinem Host oder Service zugeordnet werden können (z.b. wegen eines Tippfehlers), werden abgesehen von einem Eintrag im nagios.log stillschweigend verworfen. Mit dieser Methode kann Nagios solche Fehler melden. Die Idee stammt von Augustinus.

$MACROS = {
  NAGIOS_LOGFILES => '/var/nagios'
};
@searches = {
  tag => 'nagios_unmatched_passive_check_results',
  logfile => '$NAGIOS_LOGFILES$/nagios.log',
  archivedir => '$NAGIOS_LOGFILES$/archives',
  rotation => 'nagios-\d{2}-\d{2}-\d{2}-\d{2}.log',
  criticalpatterns => [
      '^\[\d+\] Warning:  Passive check result was received for service .* on host .* but the service could not be found',
      '^\[\d+\] Warning:  Passive check result was received for service .* on host .* but the host could not be found',
  ],
};

Beispiel 20: Windows Eventlog

Das Perl-Modul, auf dem check_logfiles unter Windows aufsetzt, kann leider nur zum Auslesen der System-, Applikations- und Security-Eventlogs verwendet werden. neben gibt es aber noch eine Unzahl von weiteren Eventlogs, potentiell kann hier jede Anwendung einen eigenen Zweig eröffnen. Um diese Events überwachen zu können, braucht man das Kommandozeilen-Tool wevtutil. Auf dem kann check_logfiles dann aufsetzen, indem man type => ‘wevtutil’ im Search angibt.
Heiko Wenzig, ein check_logfiles-Anwender der ersten Stunde, hat freundlicherweise seine Konfiguration zur Verfügung gestellt. Zu beachten ist allerdings, daß criticalpatterns nur ein Platzhalter ist und jeder selber wissen muss, was ihm wichtig ist.

@searches = ({
  tag => 'ms_kernel-evt-tracing',
  type => 'wevtutil',
  eventlog => {
    eventlog => '"Microsoft-Windows-Kernel-EventTracing/Admin"',
    include => {
      eventtype => 'error,warning',
    },
  },
  options => 'winwarncrit,noperfdata,noprotocol,preferredlevel=critical,eventlogformat="%w id:%i so:%s ca:%c msg:%m"',
  # Hier stehen die Events (die im Eventlog vom Typ Warning oder Error sein können) bei deren Auftauchen sofort gehandelt werden muss,
  # die also Nagios-seitig als CRITICAL eingestuft werden sollen.
  criticalpatterns => [
    'id:tbd so:tbd ca:tbd msg:tbd',
  ],
  # Hier kann man ein durch winwarncrit kritisches Event wieder auf Warning zurueckstufen
  criticalexceptions => [
    'id:0003 so:Microsoft-Windows-Kernel-EventTracing.* ca:Microsoft-Windows-Kernel-EventTracing/Admin msg:Die Sitzung "ReadyBoot" .*',
    'id:0002 so:Microsoft-Windows-Kernel-EventTracing\'_Guid=\'{B675EC37-BDB6-4648-BC92-F3FDC74D3CA2} ca:Microsoft-Windows-Kernel-EventTracing/Admin msg:Beim Starten der Sitzung "Circular Kernel Context Logger" .*',
  ],
  # die hier aufgefuehrten Events, sollen nicht weiter beachtet werden. 
  warningexceptions => [
    'id:0004 so:Microsoft-Windows-Kernel-EventTracing.* ca:Microsoft-Windows-Kernel-EventTracing/Admin msg:.*',
  ],
  # sämtliche anderen Events (auch solche, die noch niemals vorgekommen sind erscheinen in Nagios als WARNING. 
    warningpatterns => [
      '.*'
  ],
});

$options = 'report=long';

__END__

Eventlognamen ermitteln
eventlog = In der Computerverwaltung auf das Eventlog gehen und unter Eigenschaften den "Vollstaendigen Namen" ermitteln

Beispiele fuer die Filterung/Herabstufung von Events:
id:0003 so:Microsoft-Windows-Kernel-EventTracing.* ca:Microsoft-Windows-Kernel-EventTracing/Admin msg:Die Sitzung "ReadyBoot" .*
id:0002 so:Microsoft-Windows-Kernel-EventTracing'_Guid='{B675EC37....   # Hier beachten \ vor ' sonst gibt es einen Syntax Fehler