• Moderatore

    tail e grep non sono più in tempo reale

    Buondì,
    ho sempre usato un comando ti questo tipo
    tail -f nomelog.log | grep -v 'http://www.' | grep -v 'favicon.ico'
    e non ho mai avuto problemi.

    Attualmente il comando mi si esegue a cadenza oraria.
    In pratica se faccio solo il tail senza il grep vedo il log quasi in tempo reale, se aggiungo il grep mi sbrodola il log alla cadenza dell'ora.

    Forse vuole riempire un buffer?
    Chi mi svela questo mistero o mi consiglia un altro modo per ottenere lo stesso risultato?
    Tutto è successo dopo l'ultimo aggiornamento del sistema, con le varie librerie.


  • User Attivo

    Ciao Redsector,
    immagino che lo scopo sia quello di osservare in "diretta" il file di log di un server http.
    Capisco il grep -v 'favicon.ico', ma non il grep -v 'http :// www .':
    Che tipo di linee vuoi estrarre dal tuo log?

    :ciauz:


  • Moderatore

    Ciao,
    l'intento è quello di osservare tutti gli url in ingresso, tranne quelli in cui il referrer è il sito. Ho troncato il www.sito 🙂 per evitare spam.

    Sai che può essere successo a grep?


  • User Attivo

    Prima domandina: hai capito se la magagna la dobbiamo cercare nel tail o nel grep?
    Se fai tail -f senza | grep .... vedi un output "regolare" o a botte di un'ora per volta?

    Se il flusso in output è quello atteso allora ci focalizziamo sul grep.

    Un dubbio: il grep -v 'http: // www .' non becca anche l'URL chiamato dai client?

    Ciao


  • Moderatore

    Allora, il log con il tail -f ha un piccolo ritardo, qualche secondo con la diretta, ma penso sia normale.

    Se metto un solo grep "frequente" tipo '" 200' mi sembra sia ok, ma perchè il buffer lo riempe subito.

    Se concanteno i due grep mi prende praticamente solo i referrer esterni, quindi mi si riempe il buffer in mezz'ora circa.

    Mi sono guardato l'opzione -n di grep che riporta

    -n, --line-number print line number with output lines
    --line-buffered flush output on every line

    Però non capisco come ad attivare il flush on ad ogni linea, con solo -n non pare funzionare.
    grep -v -n 'http://www' per intenderci.


  • User Attivo

    ...ritardo di qualche secondo per tail -f? Immagino allora che il file di log sia molto grande ...
    Sei sicuro di avere risorse sufficienti quando concateni i due grep?
    Se apri una shell ulteriore per guardare con "top" l'uso di CPU e memoria mentre fai partire il tail -f |grep ... cosa vedi?
    Se fai
    cat /proc/loadavg
    che cosa ti dice?

    Ciao :ciauz:


  • Moderatore

    No ho 200 Mb di ram libera e l'occupazione media è dello 0% 🙂
    Penso che sia la gestione delle statistiche che rallenta la creazione del log.

    Ho riprovato a gestire il parametro -n, e ho azzardato un --

    tail -f file.log | grep --line-buffered -v 'http://www' | grep --line-buffered -v 'favicon.ico' e tutto sembra tornato normale.

    Quasi che sia cambiata una preferenza di consolle, non saprei.
    Esiste un modo di rendere di default il parametro --line-buffered con tutti i grep?

    Non so quale libreria sia stata aggiornata con l'ultimo update, ma devono avere toppato loro (o forse era toppato prima :1:


  • User Attivo

    @redsector said:

    Esiste un modo di rendere di default il parametro --line-buffered con tutti i grep?

    Quasi...
    puoi aggiungere un alias per tutti in /etc/bashrc
    Una cosa tipo

    [INDENT]alias grep='grep --line-buffered 3333'
    [/INDENT]
    :ciauz: