Le lundi 27 mai, Stephane Driussi a écrit :
> [Analyse des champs d'une ligne de log Apache]
> Je sais qu'il faut utiliser split ou explode mais c'est l'ecriture de la
> chaine d'analyse en php qui me pose probleme. Quelqu'un n'aurait pas un
> bout de code qui m'aiderai a comprendre comment faire ?
J'ai écrit une fonction en Perl pou faire ça sur un fichier log au
format « NCSA extended/combined log format ». Je ne sais pas si PHP
utilise les mêmes regexps que Perl, mais ou cas où ça peut t'aider,
voici ma fonction :
# Cette fonction découpe une ligne en ses diffirents champs. Les champs
# date_time et request sont à leur tour découpés en sous-champs. Le
# découpage se fait comme suit :
# ligne = 'host ident authuser [date_time] "request" status bytes
# "referer" "agent"'
# date_time = 'date:time zone'
# request = 'method file protocol'
#
# Références :
# - Documentation de Apache, module mod_log_config pour le
# « NCSA extended/combined log format ».
# - RFC 1945 pour le protocole HTTP/1.0
# - RFC 2616 pour le protocole HTTP/1.1
sub parse {
local($line) = @_;
$host = $ident = $authuser = $date_time = $date = $day = $month =
$year = $time = $hour = $minute = $second = $zone = $request =
$method = $file = $protocol = $status = $bytes = $referer =
$agent = undef;
if ($line =~ /(.*?) \[(.*?)\] (.*)/) {
$first_part = $1;
$date_time = $2;
$last_part = $3;
if ($first_part =~ /(\S*) (\S*) (\S*)/) {
$host = $1;
$ident = $2;
$authuser = $3;
}
if ($date_time =~ /(.*?):(\S*) (.*)/) {
$date = $1;
$time = $2;
$zone = $3;
if ($date =~ m|(.*?)/(.*?)/(.*)|) {
$day = $1;
$month = $2;
$year = $3;
}
if ($time =~ /(..):(..):(..)/) {
$hour = $1;
$minute = $2;
$second = $3;
}
}
if ($last_part =~ /\"(.*?)\" (\S*?) (\S*?) \"(.*?)\" \"(.*?)\"/) {
$request = $1;
$status = $2;
$bytes = $3;
$referer = $4;
$agent = $5;
if ($request =~ /(\S*) (\S*) (\S*)/) {
$method = $1;
$file = $2;
$protocol = $3;
}
}
}
}
--
Edgar Bonet Tel: +33 476 881 096
Laboratoire Louis Néel -- CNRS Mobile: +33 677 197 939
25 av. des Martyrs, BP 166 Fax: +33 476 881 191
38042 Grenoble cedex 9, France e-mail: bonet@???