consultare un log

  • Creatore Discussione Creatore Discussione xer
  • Data di inizio Data di inizio

xer

Nuovo Utente
19 Mar 2008
1
0
0
Ciao a tutti.
Faccio una premessa, sono un nuovo registrato del forum e mi sto avvicinando
al linguaggio PHP per una piccola necessità, pertanto non sono molto ferrato in materia
ma devo dire che mi sto appassionando. :-)
Spiego il contesto, scusatemi in anticipo se sono molto prolisso.

Su un server di produzione (unix) ho installato un software antispam, tale software genera un log
giornaliero, esegue pertanto una compressione dei vecchi log in gunzip e ne mantiene la loro
presenza fino al settimo giorno precedente.

Per consultare questi log, da console utilizzo solo alcuni comandi, il cat, il gzcat ed il grep.
questa è un esempio di riga di come è costruito il log:
********
Mar 19 13:33:49 fw Spamilter[26763]: Rejected 201.79.138.72 <[email protected]> <[email protected]> DNSBL 'http://www.spamhaus.org'
********

In questo caso, i campi interessanti da consultare sono i seguenti:
********
Mar 19 13:33:49 -> data ed ora dell'evento
Rejected -> intervento effettuato
(ha solo quattro variabili: Rejected, Accepted, Valid?, Spam?)
201.79.138.72 -> IP del sender
<[email protected]> -> sender
<[email protected]> -> destinatario
DNSBL 'http://www.spamhaus.org' -> causa
********
questo campo invece, non è di rilevo in quanto specifica l'hostname, il processo ed il PID.
fw Spamilter[26763]:


Pertanto, da console, se volessi consultare il log mi basta eseguire un comando come segue:

per il log giornaliero:
cat /var/log/spam.log | grep "Rejected"

per un vecchio log:
gzcat /var/log/spam.log.0.gz | grep "Rejected"

In questo modo, mi visualizza SOLO le righe REJECTED, inutile fare vedere altri esempi.
:-)

Il largo utilizzo di tale comandi, mi ha spinto a creare un file di shell (.sh) che mi permette
la scelta dei campi che vi ho descritto sopra, eccolo:
******
#!/bin/sh
field1='spam.log'
echo -n "inserisci se 'Accepted' oppure 'Rejected'= " ; read field3 ;
echo -n "inserisci elemento di ricerca libero o lascia vuoto= " ; read field4 ;
echo -n "inserisci il numero di righe da visualizzare 99999 per tutte= " ; read field2 ;
/bin/cat /var/log/$field1 | grep -m$field2 "$field3" | grep "$field4" | more
*****

Per evitare un IF THEN, mi sono creato un altro script shell IDENTICO ma con il comando gzcat
per visualizzare i log compressi.


Fatta questa premessa è sorta la necessità di dovere creare un tool in PHP per visualizzare il log
giornaliero ed i logs compressi tramite browser e quì casca l'asino, non sono molto pratico.

Ho iniziato (sbagliando) creandomi il form dei campi suddetti, in modo tale da posporli al comando
in shell... ma non ho verificato se il tutto funzionava a dovere, (infatti non funzia bene), perciò
ho lasciato perdere (per adesso) il form per gli input ed ho provato dei comandi "diretti" per verificare
la fattibilità, adesso arriva la domanda. :-)

Ho creato uno script shell "semplice" chiamato "test.sh", il quale non è che la mera esecuzione
del comando precedente, eccolo:
*******
#!/bin/sh
cat /var/log/spam.log | grep "Rejected"
*******
Poi, ho creato il seguente script in .php:

*******
<?php
$output = shell_exec('/usr/local/sbin/test.sh');
echo "<pre>$output</pre>";
?>
*******

Ecco la domanda: se eseguo il comando "test.sh" in console, l'output a video è:
Mar 19 13:33:49 fw Spamilter[26763]: Rejected 201.79.138.72 <[email protected]> <[email protected]> DNSBL 'http://www.spamhaus.org'


Se invece eseguo la pagina in .php l'output sul browser è:
Mar 19 13:33:49 fw Spamilter[26763]: Rejected 201.79.138.72 DNSBL 'http://www.spamhaus.org'

Praticamente, viene rimosso il testo racchiuso tra "<>", strano, perchè se tento di visualizzare il sorgente dal browser, i dati invece
ci sono, in colore violaceo, ma ci sono...

Come posso risolvere?
Grazie in anticipo!!!
:-)
 

Discussioni simili