Newsgroup: it.comp.os.linux.iniziare
Titolo: monitorare nuove righe in un log

Ciao, 
ho cercato in giro ma non ho trovato una soluzione. 
 
Devo monitorare una applicazione java che produce un log con rolling
giornaliero. 
 
Ho realizzato uno script awk che parsa il log e produce degli allarmi se
rileva particolari informazioni nel file. 
 
L'ho provato passando un certo numero di righe del file con 
tail -10000 logfile | awk -f script.awk 
 
Però ora vorrei metterlo a crontab ( res. ogni 5 minuti ) dando in pasto
allo script solo le righe aggiunte dall'ultima esecuzione dello script. 
 
Il numero di righe prodotte nell'unità di tempo è piuttosto variabile
quindi non posso prendere un numero fisso di record ad ogni esecuzione. 
 
Inoltre a mezzanotte il file viene sottoposto a rolling da un regola del
logger di java ( log4j ). 
 
Qualcuno conosce un modo furbo per fare ciò ?
 
 
 
-- 
Ricky
 
Scrivimi saltando i cancelletti ( * = . )
mb#ox#*#ric#ky@yah#oo*it
 
oppure usa il seguente link
http://www.mynewsgate.net/mp.php?u=19024
 
 

 Qualcuno conosce un modo furbo per fare ciò ?
 
non puoi tenere il tail in follow e fargli processare ogni riga solo 
quando ne arriva una nuova, senza passare da cron?
 

 quando ne arriva una nuova, senza passare da cron?
 
 
ho fatto un test, per gestire anche la rotazione ci vuole follow + retry
 
tail -F logfile 2>/dev/null | etcetc
 
 
dovrebbe fare quello che chiedi
 

 quando ne arriva una nuova, senza passare da cron?
 
No perchè devo estrarre una statistica degli eventi che arrivano in una
certa finestra temporale quindi devo per forza inviare allo script awk un
cero numero di righe 


 logger di java ( log4j ).
 
Scusa ma non ci arrivo ... Che cosa comporta? che se controlli ogni 5
minuti, potresti perdere i log degli ultimi 5 min della giornata?
 
 

 un cero numero di righe
 
 
 
manda l'stdout del tail -F in un un while read line che appende  ogni 
linea ad un file di appoggio
 
Quando raggiungi il criterio (numero di linee mandate, o numero di 
secondi passati, o un mix dei due) , processi il file di appoggio e dopo 
lo svuoti
 
 
#!/bin/bash
var=0
lines=5000
tail -F logfile 2>/dev/null | while read -r line
do
	var=$((var + 1))
	echo "$line" >> miolog
	if [ $var -eq $lines ]; then
		# qui mandi awk su miolog
		rm miolog
		var=0
	fi 
done 

> logger di java ( log4j ).
 
E` bastato chiederti di condividere il tuo codice per farti sparire?
Vabbe`!
Tanto hai risolto con RedWiz .. :-)
 
Cmq seguendo il tuo ragionamento, con cron ecc, e tenendo conto che ogni
giorno il log si azzera per cui basta controllare l'ora, se il file di
log fosse simile a questo:
 
apr 29 10:18:53 baby kernel: BIOS-e820: [mem 0x00000000fed1c000-0x00000000fed1ffff] reserved
apr 29 10:18:53 baby kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
apr 29 10:18:53 baby kernel: BIOS-e820: [mem 0x00000000ffb80000-0x00000000ffffffff] reserved
apr 29 10:18:53 baby kernel: BIOS-e820: [mem 0x0000000100000000-0x000000013f5fffff] usable
apr 29 11:24:53 baby kernel: BIOS-e820: [mem 0x00000000ffb80000-0x00000000ffffffff] reserved
apr 29 11:59:53 baby kernel: BIOS-e820: [mem 0x00000000fed1c000-0x00000000fed1ffff] reserved
apr 29 12:14:53 baby kernel: BIOS-e820: [mem 0x00000000fed1c000-0x00000000fed1ffff] reserved
 
avrei fatto cosi`:
 
#!/bin/bash
let five_min_ago_in_sec=`date +%s`-300
# Visualizzo solo i log degli ultimi 5 min
awk -v five_min_ago="$(date -d @$five_min_ago_in_sec +"%T")" \
    '{if ($3 >= five_min_ago) print}' filelog.log
 
 

M_M <sp...@the.hell> ha scritto:
 
come al solito su mynewsgate sparisce qualche pezzo; riprovo:


     '{if ($3 >= five_min_ago) print}' filelog.log
 
credo che così rischi di perderti (fino  a) gli ultimi 5 minuti prima 
della rotazione

 della rotazione
 
Si certo, avevo chiesto all'OP se questo sarebbe stato un problema ma non ho 
ricevuto risposta ..
 
 
 

 della rotazione
 
Emh! indubbiamente la soluzione corretta e` la tua e non la mia :-) ma visto 
che mi ero scervellato con quel cavolo di AWK che per me risulta sempre 
ostico, ho pensato di postarla lo stesso perche` magari potrebbe tornar utile 
in futuro a qualcuno in un'altra situazione.
 
 
 


Questa è la soluzione più semplice data la mia ignoranza.
Oppure wc -l file (conta il nr righe) vecchio
wc -l file (conta il nr di righe) nuovo
dopo con tail puoi vedere le differenze
 
ciao e buon linux