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 :
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 majusculeExemple :
./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 BDmy $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 derniermy $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.
Laissez un commentaire
Publicité :)
Articles récents
- Memento VI – Boostez Votre Productivité avec Vi : Trucs et Astuces à Connaître
- Configuration de Nginx pour Obtenir l’IP Réelle des Visiteurs avec CloudFlare
- Récupérer les informations d’un Ordinateur Terra à partir du numéros de série avec Python
- Grep – Extraire toutes les adresses IP d’un fichier text, Json, etc…
- Failed to Start File System Check – Vcenter 7
Mot-clefs
Commentaires récents
- Grep – Extraire toutes les adresses IP d’un fichier text, Json, etc… dans
- Grep – Extraire toutes les adresses IP d’un fichier text, Json, etc… dans
- Rotation des logs avec logrotate dans
- Hôte déconnecté sur le Vcenter. Impossible de se connecter à l’ESX. dans
- Pourquoi mon interface vlan ne veut pas devenir up ? dans