Mar
13
2008

Projet SYSLOG


Configuration Syslogd :

Voici mon fichier syslog.conf :

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don’t log private authentication messages!
#*.info;mail.none;authpriv.none;cron.none               /var/log/messages
local1.*                                                /log/site1/all.log
local2.*                                                /log/site2/all.log

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

Ici on sépare les logs des differents sites. la séparation est utilisé uniquement pour avoir un visu des logs sur le serveur.

 

Configuration des équipements réseaux :

logging trap warning
logging facility local2
logging IP_SERVEUR_SYSLOG

  • logging trap permet de selectionner le niveau de log
  • logging facility permet de differencier au niveau serveur syslog les différents sites.
  • logging permet de specifier le serveur syslog auquel envoyé les logs.

Préparation de mysql pour la réception des logs parser :

Il vous faut une base de donnée nommé syslog.

Voici la structure des tables :

 

ScreenShot001

ScreenShot002

Script de parsing des logs v1.0 :

#!/usr/bin/perl
# Titre : Parseur de fichier log
# Auteur : Olivier Legras
# Date : 03/08
# Version : 1.0
#
# Description : Ce script permet de décomposé les messages de log reçu via syslog et de les stocker dans
#               une base mysql. Ce script devra être executé plusieurs fois par jour.
#

use Parse::Syslog;
use Date::Manip;
use DBI(); # Utilisation de la BD
use POSIX qw(strftime); #Date du jour
use Getopt::Long;
use strict;

my $help; my $client; my $chemin; my $anee;

#ARGUMENTS

# Affichage de l’aide
my $USAGE = <<EOF;
usage: $0 -options
  Options:
    -help             Affiche cet écran
    -path             Chemin du fichier log à parser
    -partenaire       Partenaire à analyser en majuscule

    Exemple :
    ./parser_syslog.pl -path /log/courneuve/all.log  -partenaire COURNEUVE
EOF

# Commandes optionnelles
&GetOptions(« help »    => $help,
            « path:s »    => $chemin,
            « partenaire:s »    => $client);

if ($help) {
    die « $USAGE »;
}

my $date = strftime « %Y », localtime;
print $date. » – « .$chemin. » – « .$client. »n »;

my $dbh = DBI->connect(« DBI:mysql:database=syslog;host=localhost »,
                          « root », « mdp »,
                          {‘RaiseError’ => 1});

Parser_log($chemin,$date,$client,’Reseau’);

sub Parser_log {

  my $path = $_[0];
  my $annee = $_[1];
  my $partenaire = $_[2];
  my $categorie = $_[3];
  my $temps_ecoule; my $host2; my $timestamp;
  my $type;
  my $message;
  my @liste;

my $parser = Parse::Syslog->new( $path , year => $annee);
while(my $sl = $parser->next) {
    $message=$sl->{text};
    $timestamp=$sl->{timestamp};
    $host2=$sl->{host};
    $timestamp = UnixDate(ParseDate(« epoch $timestamp »), ‘%y-%m-%d %T’);

@liste = split(/:/,$message);

$temps_ecoule = @liste[0];
$type = @liste[1];
$message = @liste[2];
print $timestamp. » – PARTENAIRE : « .$partenaire. »n »;
$dbh->do(« INSERT INTO `syslog`.`message` (`id`,`timestamp`,`host`,`temps_ecoule`,`type_message`,`message`,`partenaire`,`categorie`) VALUES ( »,’$timestamp’,’$host2′,’$temps_ecoule’,’$type’,’$message’,’$partenaire’,’$categorie’); »);
}
$dbh->disconnect();
exec « cat /dev/null > $path »;

}

Veillez a bien renseigner les comptes d’accès à mysql.

Voici un exemple d’utilisation :

./parser_syslog.pl -path /log/site1/all.log  -partenaire Site1

Ce script doit être planifier plusieurs fois par jour.

Archivage de la table message dans historique

Ce script permet de rassembler tous les mêmes messages identiques par host et de stocké le message, la date et l’ heure du dernier message… Puis vider la table message. De cette manière la base de donnée ne prendra pas des proportions démesurées. Ce script sera à executer une fois par jour.

 

#!/usr/bin/perl
# Titre : Parseur de fichier log
# Auteur : Olivier Legras
# Date : 03/08
# Version : 1.0
#
# Description : Ce script permet d’alleger la base mysql rempli par le script parser_syslog.pl.
#

use strict;
use Parse::Syslog;
use Date::Manip;
use DBI(); # Utilisation de la BD

my $temps_ecoule;my $partenaire; my $categorie; my $host2; my $timestamp2;
my $type;
my $message;
my @liste;
my $host; my $i_message;my $occurence;
my $timestamp_dernier;
my $type ;my $categorie; my $partenaire; my $occurence_total;
my $dbh = DBI->connect(« DBI:mysql:database=syslog;host=localhost »,
                          « root », « mdp »,
                          {‘RaiseError’ => 1});

#HISTORIQUE

##On lit la table message en fonction du hosts
my $sth2= $dbh->prepare(« SELECT * FROM message »);
$sth2->execute();
my $i=0;
my @tab_host;
while (my $ref2 = $sth2->fetchrow_hashref()) {
   @tab_host[$i] = $ref2->{‘host’};
   $i=$i+1;
}
$sth2->finish();

#On vire les doublons de tab_host

my %hachage   = map { $_, 1 } @tab_host;
my @liste_host = keys %hachage;

#on lit les messages de chaque host

foreach $host (@liste_host)
{
      my $sth_host= $dbh->prepare(« SELECT * FROM message WHERE host=’$host' »);
      $sth_host->execute();
      my $i=0;
      my @tab_host;
      my @tab_message;
      while (my $ref_host = $sth_host->fetchrow_hashref()) {
        @tab_message[$i] = $ref_host->{‘message’};
        $i=$i+1;
      }
      $sth_host->finish();

      # On vire les messages en double

      my %hachage2   = map { $_, 1 } @tab_message;
      my @liste_message = keys %hachage2;

      #On lit le tableau et on compte le nombre d’occurence dans la table message

     #print « HOST = $hostn »;

    foreach $message (@liste_message)
    {
       my $sth_message= $dbh->prepare(« SELECT * FROM message WHERE message=’$message’ AND host=’$host’ ORDER BY timestamp DESC »);
       $sth_message->execute();
       $i_message=0;
       my @tab_message;
       while (my $ref_message = $sth_message->fetchrow_hashref()) {
          # On récupère le dernier message
         if ($i_message==0){
           $timestamp_dernier = $ref_message->{‘timestamp’};
           $type = $ref_message->{‘type_message’};
           $categorie = $ref_message->{‘categorie’};
           $partenaire = $ref_message->{‘partenaire’};

         }
       $i_message=$i_message+1;

      }

      if ($i_message>0){

        #print « Nombre d’occurence du message : $i_message Timestamp=$timestamp_derniern »;
        #print $message. »n »;
        #On vérifier que le message se trouve dans la base historique en fonction
        #du host et du message
        my $sth_histo= $dbh->prepare(« SELECT * FROM historique WHERE message=’$message’ AND host=’$host' »);
        $sth_histo->execute();
        #:my $i_message=0;
        my @tab_message;

        if (my $ref_message = $sth_histo->fetchrow_hashref()) {
        $occurence = $ref_message->{‘occurence’};

        $occurence_total = $i_message + $occurence;
        print $i_message. » + « .$occurence. » = $occurence_totaln »;

          # on modifie le compteur et la dernière date
          my $sth_historique= $dbh->prepare(« UPDATE `syslog`.`historique` SET occurence=’$occurence_total’, timestamp=’$timestamp_dernier’  WHERE message=’$message’ AND host=’$host' »);
          $sth_historique->execute();
        }
        else{
          #On ajoute le dernier

          my $sth_historique2= $dbh->prepare(« INSERT INTO `syslog`.`historique` (`id`,`timestamp`,`host`,`occurence`,`type_message`,`message`,`partenaire`,`categorie`) VALUES ( »,’$timestamp_dernier’,’$host’,’$i_message’,’$type’,’$message’,’$partenaire’,’$categorie’); »);
          $sth_historique2->execute();
        }

      }
    $sth_message->finish();
    }

}
#On vide la table message
my $sth_vider= $dbh->prepare(« TRUNCATE TABLE `message` »);
$sth_vider->execute();

#On ferme la session mysql
$dbh->disconnect;

Il ne reste plus qu’ à utiliser les informations de la base mysql pour afficher sur des pages web.

Au sujet de l'auteur: Olivier Legras

Auteur de ce Blog, je partage quelques unes de mes notes que je juge utile à vous comme à moi. Je suis très heureux de voir que mon blog a de plus en plus d'affluence. Merci à vous!

Laissez un commentaire



Je soutiens

Publicité :)

Mes derniers tweets