Trace d'un fichier de log

Trace de fichier log d'apache

Version PDF

Le fichier access.log du serveur Web Apache enregistre dans un fichier texte toutes les requêtes HTTP emises. Il se trouve dans le répertoire apache/logs.

Par exemple la ligne suivante extraite d'un fichier log founit les informations suivantes :

172.16.0.2 - - [21/May/2006:06:25:33 +0200] "POST /ocsinventory HTTP/1.1" 200 88 "-" "OCS-NG_linux_client_v9"

L'adresse IP de l'émetteur (172.16.0.2) de la requête, le jour et l'heure (21/May/2006:06:25:33), la méthode utilisée (POST) (la ressource demandée (/ocsinventory) , un code de retour HTTP (200 -ressource trouvée-) et le SE du demandeur(linux).

La trace de ce fichier permet de repérer les intrusions malvenues éventuelles mais aussi seulement l'activité du serveur (sa charge par exemple).

Le programme à réaliser ici va consister à extraire du fichier log les adresses IP ainsi que les jour et heure d'activité.

Travail à faire.
Télécharger un fichier log de test. Observez-le.

 

Cas d'utilisation. Visualisation des accès à Apache

Acteur : l'administrateur réseaux

Scénario normal
1. L'administrateur demande le formulaire de gestion des accès
2. Le système retourne un formulaire
3. L'administrateur sélectionne le fichier log
4. Le système pointe sur le fichier demandé
5. L'admistrateur sélectionne une date début et une date fin
6. Le système retourne tous les accès (IP, date et heures précises)

Scénario alternatif
6.1 La date sélectionnée de fin de log est inférieure à la date de début, le système en avertit l'administrateur. retour à 5.

Analyse

L'accès au fichier log sera réalisé par une classe Passerelle qui aura la responsabilité de lire le fichier log, extraire les informations (ip et date) et retourner un DataSet.

 

fig1 Classe Passerelle

Pour charger la classe Periode qui contient tous les accès entre deux dates, il faudra parcourir la fichier log (trié par accès) et ajouter un accès par ligne du fichier log.

Travail à faire.

Justifier le signature de la méthode getDonnees.

La classe passerelle.

Cette classe assure les responsabilités suivantes :

  • Extraire l'IP à partir d'une chaîne de caractères (la ligne lue dans le fichier log), sa signature est :
                    private static string getIP(string ligne)
  • Extraire la date et l'heure à partir d'une chaîne de caractères (la ligne lue dans le fichier log), sa signature est :
                    private static DateTime getDateHms(string ch)
  • Parcourir le fichier log et valoriser un objet DataSet, c'est la seule méthode publique de la classe (getPeriode)

Travail à faire.

  • Ecrire la méthode getIP. Vous utiliserez la méthode Split de la classe string ; regarder l'aide. Trouvez le caractère délimiteur.
    Pour tester dans l'interface graphique ajouter un bouton et un label, mettre provisoirement la méthode getIP public, dans le click du bouton, copier le code suivant :

private void button1_Click(object sender, System.EventArgs e)
{
             StreamReader sr = new StreamReader("access.log");
             string ligne=sr.ReadLine();
             label1.Text=Passerelle.getIP(ligne);
}

Ajouter la clause using System.IO; pour utiliser la classe StreamReader
Vous regarderez, si besoin, l'aide pour comprendre les deux premières lignes.
Attention, le fichier log doit être placé dans le répertoire d'exécution du programme (répertoire bin\debug)
A l'éxécution, vous devez obtenir :


fig 3 affichage de la première ip du fichier log

  • Ecrire la méthode getDateHms. Il faudra utiliser encore la méthode split en trouvant les bons séparateurs afin d'extraire, dans l'ordre, le jour, le mois, l'année, l'heure, les minutes et secondes. Il faudra aussi, pour instancier l'objet DateTime à retourner, transformer le mois en entier (May en 5 par exemple).
    Tester en écrivant le code suivant :
                 private void button1_Click(object sender, System.EventArgs e)
                 {
                               StreamReader sr = new StreamReader("access.log");
                               string ligne=sr.ReadLine();
                               DateTime dt =Passerelle.getDateHms(ligne);
                               lblJour.Text=dt.Day.ToString();
                               lblMois.Text=dt.Month.ToString();
                               lblAnnee.Text=dt.Year.ToString();
                               lblHeure.Text=dt.Hour.ToString();
                               lblMn.Text=dt.Minute.ToString();
                               lblS.Text=dt.Second.ToString();
                    }

    Vous devez obtenir l'écran suivant :


fig 4 affichage des éléments de la première date du fichier log

La méthode getDonnees.

Cette méthode prend en paramètre deux DateTime, un pour le début et l'autre pour la fin de l'intervalle sélectionné. Cette méthode parcours le fichier et pour chaque ligne, vérifie si la date est comprise dans l'intervalle ; dans ce cas un objet DataRow va être ajouté à une DataTable (lesAcces) du DataSet retourné en fin de méthode.

On donne les premières lignes :
             StreamReader sr = new StreamReader(nomFichier);
             DataSet ds= new DataSet();
             DataTable tab = new DataTable("lesAcces");
             ds.Tables.Add(tab);
             tab.Columns.Add("ip");
             tab.Columns.Add("jmaHms");

Travail à faire.
Commenter chaque ligne fournie.
Ecrire la suite de la méthode getDonnees.
Tester à l'aide d'un DataGrid dans le formulaire :

                DateTime deb = new DateTime(2006,5,22);
                DateTime fin = new DateTime(2006,5,23);
                DataSet ds = Passerelle.getDonnees("access.log",deb,fin);
                dg.DataSource=ds.Tables["lesAcces"];     //binding du DataGrid

Afin d'obtenir l'écran :


fig 2 affichage des accès

Remarque : pour visualiser toutes les informations, il faut agrandir les colonnes du DataGrid.