Dans ce second exemple, nous allons vous montrer un exemple simple depuis un espace Internet administrateur. Imaginez que vous ayez du mal à aligner les textes de votre programme apache access.log et à transférer ces enregistrements vers la base de données de votre serveur. Il s'agit d'un petit snippet from de votre historique d'accès capturé par notre serveur et qui va nous servir dans cet exemple:
70.242.222.162 - - [01/Jan/2005:21:57:28 +0100] "GET /unitminer/ HTTP/1.1" 200 26080 "http://www.webradev.com/?p=CustomDev" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; YPC 3.0.1; .NET CLR 1.1.4322; yplus 4.1.00b)"
70.242.222.162 - - [01/Jan/2005:21:57:29 +0100] "GET /css/test.css HTTP/1.1" 200 5651 "http://www.unitminer.com/unitminer/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; YPC 3.0.1; .NET CLR 1.1.4322; yplus 4.1.00b)"
70.242.222.162 - - [01/Jan/2005:21:57:33 +0100] "GET /img/qu_logo.png HTTP/1.1" 200 3731 "http://www.unitminer.com/unitminer/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; YPC 3.0.1; .NET CLR 1.1.4322; yplus 4.1.00b)"
Premièrement, nous voyons que les lignes du fichier ont la même structure. Vous pouvez voir le format de l'historique sous l'aide de Apache:
%h %l %u %t "%r" %>s %b "%{Referrer}i" "%{User-agent}i"
Où:
%h – adresse IP du client
%l - l' "hyphen" qui indique que ces informations sont indisponibles
%u - le nom d'utilisateur de la personne réclamant le document comme cela est déterminé par l'identification par HTTP
%t - le temps nécessaire au serveur pour traiter la demande
%r - La demande du client
%>s - Le code de statut que le serveur renvoie au client
%b - la dernière entrée indique la taille de l'objet renvoyée au client, sans mentionner les intitulés de la réponse
%{Referrer}i – source HTTP
%{User-agent}i - les informations d'identification que le navigateur du client rapporte sur lui-même
Nous utiliserons la structure <Section While> qui répère l'éxécution de sous-éléments dans la section, jusqu'à ce que chaque valeur soit juste. Rédigeons à présent un petit échantillon de texte pour notre script (la meilleure approche est générallement de la copier depuis un script existant)
#define main section of script
<Section>
#define name of section
Name AccessLog
# load content from file on disk
<Action ContentFile>
#load content from following file
FileName c:/temp/access.log
</Action>
<Section While>
#later we will put code that matches and processes log row here
</Section>
</Section>
#start execution of Section with name AccessLog
Main AccessLog
La principale nouvelle est surlignée dans le code source:
Nous allons maintenant ajouter un schéma qui correspondra à une ligne de l'historique d'accès. Nous placerons ce schéma sous le cyle<Section While>
Nous voulons utiliser que le Titre de la nouvelle principale et le petit texte situé sous l'image.
Comme vous le voyez, ce dernier est encadré de tags <div class="cnnMainT1Hd"> … </div> et le texte est contenu entre les tags <div class="cnnMainT1"> … </div>
<Section>
Name AccessLog
# load content from file on disk
<Action ContentFile>
#load content from following file
File c:/temp/access.log
</Action>
<Section While>
#match one line inside log file with following pattern
<Pattern>
Name LogRow
RegExp ^{$client_ip:regexp(\S+)} \
{$ident:regexp(\S+)} \
{$userid:regexp(\S+)} \
[{$date:regexp(([^:]+):(\d+:\d+:\d+) ([^\]]+))}] \
"{$request:regexp(.+?)}" \
{$status:regexp(\S+)} \
{$size:regexp(\S+)} \
"{$referer:regexp(.+?)}" \
"{$client_type:regexp(.+?)}"{:regexp(\s+)}
</Pattern>
</Section>
</Section>
#start execution of Section with name AccessLog
Main AccessLog
Dans les étapes précédentes, nous avons défini un schéma de correspondance mais nous ne constatons aucun résultats. Nous allons donc créer une action qui imprimera certaines valeurs par défaut.
Tous les types de textes peuvent être imprimés avec <Action Print>. Le texte doit être configuré comme un paramètre de l'attribut Text
Chaque script contient la saction principale qui télécharge la page depuis l'URL indiquée, puis réalise une action avec le contenu téléchargé. Nous allons voir comment associer les données aux étapes suivantes.
<Section>
Name AccessLog
# load content from file on disk
<Action ContentFile>
#load content from following file
File c:/temp/access.log
</Action>
<Section While>
#match one line inside log file with following pattern
<Pattern>
Name LogRow
RegExp ^{$client_ip:regexp(\S+)} \
{$ident:regexp(\S+)} \
{$userid:regexp(\S+)} \
[{$date:regexp(([^:]+):(\d+:\d+:\d+) ([^\]]+))}] \
"{$request:regexp(.+?)}" \
{$status:regexp(\S+)} \
{$size:regexp(\S+)} \
"{$referer:regexp(.+?)}" \
"{$client_type:regexp(.+?)}"{:regexp(\s+)}
</Pattern>
#print what we matched in pattern
<Action Print>
Text {$client_ip}, {$ident}, {$userid}, \
{$date}, {$request}, {$status}, {$size}, \
{$referer}, {$client_type}<br>
</Action>
</Section>
</Section>
#start execution of Section with name AccessLog
Main AccessLog
L'action définie imprimera les données associées par défaut.
Nous voyons que les données associées sont réparties depuis notre historique et are affichées par défaut. Nous allons enfin enregistrer les données de l'historique sur la base de données. Supposons que nous disposions d'une base de données MySQL nommée server_stat et qu'il existe un tableau nommé accesslog avec les colonnes suivantes: clientip, request_time, request and created.
Pour insérer les données dans la base de données, nous pouvons utiliser le tag <Action SaveDbRow>.
<Section>
Name AccessLog
# load content from file on disk
<Action ContentFile>
#load content from following file
File c:/temp/access.log
</Action>
<Section While>
#match one line inside log file with following pattern
<Pattern>
Name LogRow
RegExp ^{$client_ip:regexp(\S+)} \
{$ident:regexp(\S+)} \
{$userid:regexp(\S+)} \
[{$date:regexp(([^:]+):(\d+:\d+:\d+) ([^\]]+))}] \
"{$request:regexp(.+?)}" \
{$status:regexp(\S+)} \
{$size:regexp(\S+)} \
"{$referer:regexp(.+?)}" \
"{$client_type:regexp(.+?)}"{:regexp(\s+)}
</Pattern>
#store matched data also to database table
<Action SaveDbRow>
# Optional tells the system that if database insert
# fails, script can continue execution
Optional
#defines name of action
Name save-to-db
#database server name
Server localhost
#database type
DBType mysql
#Database name
Database server_stat
Username root
Password root
#store data to table with name accesslog
TableName accesslog
#define mapping between column names and matched variable names
ColumnDef clientip, $client_ip
ColumnDef request_time, $date
ColumnDef request, $request
# predefined variable $_NOW will return current datetime
ColumnDef created, $_NOW
</Action>
</Section>
</Section>
#start execution of Section with name AccessLog
Main AccessLog
L'action définie imprimera les valeurs par défaut.