Scripts Perl

Dernière mise à jour : 26/05/2016

Fichier journal Apache

Énoncé

À partir d'un fichier journal d'accès Apache au format par défaut, créez différents fichiers pour faire ressortir les requêtes qui ont généré les erreurs suivantes :

  • page déplacée (code 301 et 302)
  • page non trouvée (code 404)
  • accès refusé (code 403)
  • erreurs du serveur (codes 5**)
  • créez également un fichier "fourre-tout" qui contiendra tout ce qui n'est pas correct (code 200) et qui n'a pas été placé dans un des fichiers précédemment cité.

Solution

#!/usr/bin/perl

# (c) Sébastien Adam 2013
# Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage
# dans les Mêmes Conditions 2.0 Belgique.

@ARGV && $#ARGV == 0 || die "Usage: $0 <path_to_log_file>\n";

open INPUT,"<".$ARGV[0]         or die "$0: Can't read ".$ARGV[0].": $!\n";
open MOVED,">moved.log"         or die "$0: Can't create moved log file: $!\n";
open NOT_FOUND,">not_found.log" or die "$0: Can't create not found log file: $!\n";
open FORBIDDEN,">forbidden.log" or die "$0: Can't create forbidden log file: $!\n";
open SERVER,">server_error.log" or die "$0: Can't create server errors log file: $!\n";
open OTHER,">other_error.log"   or die "$0: Can't create other errors log file: $!\n";
while(chomp($line = <INPUT>)) {
  if($line =~ /^([\d\.]+)\s(.+?)\s(.+?)\s(\[.+?\])\s(".+?")\s(\d+)\s(\d+)$/) {
    $host     = $1;
    $ident    = $2;
    $username = $3;
    $datetime = $4;
    $request  = $5;
    $code     = $6;
    $size     = $7;
    if(($code == 301) or ($code == 302)) {
      print MOVED $line."\n";
    } elsif($code == 404) {
      print NOT_FOUND $line."\n";
    } elsif($code == 403) {
      print FORBIDDEN $line."\n";
    } elsif($code =~ /^5\d{2}$/) {
      print SERVER $line."\n";
    } elsif($code != 200) {
      print OTHER $line."\n";
    }
  }
}
close OTHER;
close SERVER;
close FORBIDDEN;
close NOT_FOUND;
close MOVED;
close INPUT;