[RISOLTO] Dopo logrotate Apache scrive su access.log.1

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
roberto67
Packager
Packager
Messaggi: 363
Iscritto il: lun 14 set 2009, 18:55
Slackware: 15.0 multilib
Desktop: plasma 5
Contatta:

[RISOLTO] Dopo logrotate Apache scrive su access.log.1

Messaggio da roberto67 »

Da tempo osservo questo strano comportamento, che compromette la lettura delle statistiche con awstats.
Occasionalmente, ma puntualmente al momento in cui settimanalmente scatta il logrotate di apache, il programma continua a scrivere sul vecchio file:

Codice: Seleziona tutto

# ls -l
total 57800
-rw-r--r-- 1 root apache        0 2012-02-26 04:40 access.log
-rw-r--r-- 1 root apache  4016145 2012-02-26 20:18 access.log.1
-rw-r--r-- 1 root apache   419853 2012-02-26 04:40 access.log.2.gz
-rw-r--r-- 1 root apache   223981 2012-02-19 04:40 access.log.3.gz
-rw-r--r-- 1 root apache   438735 2012-02-12 04:40 access.log.4.gz
-rw-r--r-- 1 root apache   326304 2012-02-05 04:40 access.log.5.gz
e questo su tutti i log, tant'è che gli utenti si lamentano dato che le statistiche di awstats sono basate sull'access log.

Questo è il log rotate di apache:

Codice: Seleziona tutto

# more logrotate.d/apache 
/usr/local/www/logs/*.log {
    weekly
    missingok
    rotate 5
    compress
    delaycompress
    notifempty
    create 644 root apache
    sharedscripts
    prerotate
        apachectl graceful-stop
        sleep 30
    endscript
    postrotate
        apachectl start
    endscript
}
come vedete ho introdotto un graceful-stop + uno sleep di 30 secondi, ma non ho risolto. Non so più a che pensare..

Ogni aiuto sarebbe estremamente gradito.
Ultima modifica di roberto67 il lun 27 feb 2012, 17:25, modificato 1 volta in totale.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Dopo logrotate Apache scrive su access.log.1

Messaggio da targzeta »

Bisognerebbe vedere dove apache scrive i log: magari per errore ci hai messo un '.1' e quindi semplicemente fa quello che deve fare.

E' strano che logrotate non compressi il file nonostante una direttiva gli di dica di farlo.

Un restart come postrotate basta e avanza, un restart infatti implica la chiusura dei file descriptor e una riapertura dei file.

Sarebbe anche interessante vedere il file di configurazione di logrotate, molte direttive potrebbero essere dei duplicati di quelle globali. Infatti una configurazione standard per apache è la seguente:

Codice: Seleziona tutto

/var/log/httpd/*_log {
  sharedscripts
  postrotate
    /etc/rc.d/rc.httpd restart
  endscript
}
che basta per fargli fare quello che uno si aspetta da lui.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

roberto67
Packager
Packager
Messaggi: 363
Iscritto il: lun 14 set 2009, 18:55
Slackware: 15.0 multilib
Desktop: plasma 5
Contatta:

Re: Dopo logrotate Apache scrive su access.log.1

Messaggio da roberto67 »

non riesco a riprodurre il problema. Se lancio manualmente il logrote con logrotate -f il problema non si presenta.
spina ha scritto:Bisognerebbe vedere dove apache scrive i log: magari per errore ci hai messo un '.1' e quindi semplicemente fa quello che deve fare.
ricontrollando, è tutto regolare. Il problema poi mi si presenta su sutti i file.log associati ai vari domini virtuali di apache
spina ha scritto: E' strano che logrotate non compressi il file nonostante una direttiva gli di dica di farlo.
lo comprime. Solo il primo non lo comprime, ma mi pare in accordo con quanto scritto nel "man logrotate"
spina ha scritto: Un restart come postrotate basta e avanza, un restart infatti implica la chiusura dei file descriptor e una riapertura dei file.

Sarebbe anche interessante vedere il file di configurazione di logrotate, molte direttive potrebbero essere dei duplicati di quelle globali. Infatti una configurazione standard per apache è la seguente:

Codice: Seleziona tutto

/var/log/httpd/*_log {
  sharedscripts
  postrotate
    /etc/rc.d/rc.httpd restart
  endscript
}
che basta per fargli fare quello che uno si aspetta da lui.

Emanuele
boh.. mi pare sostenzialmente uguale al mio..

grazie, Emanuele. stiamo a vedere..

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Dopo logrotate Apache scrive su access.log.1

Messaggio da targzeta »

Ho notato solo ora la direttiva 'dealycompress'. Quindi il fatto di non comprimere il primo log è normale, hai ragione, scusa.

Sai cosa potrebbe essere? Il non avergli dato il path assoluto del programma da eseguire:

Codice: Seleziona tutto

...
postrotate/endscript
    The lines between postrotate and endscript (both of which must appear on lines by themselves) are executed (using /bin/sh) after the log file is rotated. These directives may only appear inside a log file definition. Normally, the absolute path to the log file is passed as first argument to the script. If sharedscripts is specified, whole pattern is passed to the script.
quindi succede che logrotate ruota i file ma non fa ripartire apache. Dovresti poterlo notare anche dai log del server apache. Se noti che vi è traccia di un restart, allora il problema è lì.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

roberto67
Packager
Packager
Messaggi: 363
Iscritto il: lun 14 set 2009, 18:55
Slackware: 15.0 multilib
Desktop: plasma 5
Contatta:

Re: Dopo logrotate Apache scrive su access.log.1

Messaggio da roberto67 »

spina ha scritto:Ho notato solo ora la direttiva 'dealycompress'. Quindi il fatto di non comprimere il primo log è normale, hai ragione, scusa.

Sai cosa potrebbe essere? Il non avergli dato il path assoluto del programma da eseguire:

Codice: Seleziona tutto

...
postrotate/endscript
    The lines between postrotate and endscript (both of which must appear on lines by themselves) are executed (using /bin/sh) after the log file is rotated. These directives may only appear inside a log file definition. Normally, the absolute path to the log file is passed as first argument to the script. If sharedscripts is specified, whole pattern is passed to the script.
quindi succede che logrotate ruota i file ma non fa ripartire apache. Dovresti poterlo notare anche dai log del server apache. Se noti che vi è traccia di un restart, allora il problema è lì.

Emanuele
uh.. hai ragione, però vedo che apache riparte ogni volta che faccio "logrotate -f". Ad ogni modo ho corretto.. Strano.. non ci dovrebbero essere differenze tra "logrotate -f" e ciò che viene eseguito con il cronjob..
Ora sto facendo ruotare giornalmente, vediamo che succede stanotte.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: Dopo logrotate Apache scrive su access.log.1

Messaggio da targzeta »

roberto67 ha scritto:...
uh.. hai ragione, però vedo che apache riparte ogni volta che faccio "logrotate -f". Ad ogni modo ho corretto.. Strano.. non ci dovrebbero essere differenze tra "logrotate -f" e ciò che viene eseguito con il cronjob..
Ora sto facendo ruotare giornalmente, vediamo che succede stanotte.
Invece sì. Quando esegui 'logrotate -f' l'ambiente in cui viene eseguito il comando è il tuo, quindi con tutto il tuo bel PATH. Se invece il comando viene eseguito via crond allora si becca l'ambiente del comando crond, che di solito è più ristretto per motivi di sicurezza. Se metti un job che ti stampa l'ambiente (ad esempio 'set > /tmp/env') vedi l'ambiente in cui viene eseguito logrotate.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

roberto67
Packager
Packager
Messaggi: 363
Iscritto il: lun 14 set 2009, 18:55
Slackware: 15.0 multilib
Desktop: plasma 5
Contatta:

Re: Dopo logrotate Apache scrive su access.log.1

Messaggio da roberto67 »

spina ha scritto:
roberto67 ha scritto:...
uh.. hai ragione, però vedo che apache riparte ogni volta che faccio "logrotate -f". Ad ogni modo ho corretto.. Strano.. non ci dovrebbero essere differenze tra "logrotate -f" e ciò che viene eseguito con il cronjob..
Ora sto facendo ruotare giornalmente, vediamo che succede stanotte.
Invece sì. Quando esegui 'logrotate -f' l'ambiente in cui viene eseguito il comando è il tuo, quindi con tutto il tuo bel PATH. Se invece il comando viene eseguito via crond allora si becca l'ambiente del comando crond, che di solito è più ristretto per motivi di sicurezza. Se metti un job che ti stampa l'ambiente (ad esempio 'set > /tmp/env') vedi l'ambiente in cui viene eseguito logrotate.

Emanuele
chiarissimo, questo spiega tutto :thumbright:

allora metto il mitico risolto

Rispondi