Newsgroup: it.comp.os.linux.sys
Titolo: Aggregatore log apache

Supponiamo di avere un server apache con 10 vhost configurati
ed i rispettivi log.
ogni vhost logga nel suo file.
Posso configurare, fuori dal vhost, un aggregatore dove
far loggare tutti gli access log in un singolo file pur
mantenendo anche la suddivisione per vhost?
in pratica, ciascun vhost dovrebbe venir loggato due volte,
una nel suo file indicato in CustomLog dentro il vhost, l'altro
nel file generale indicato in httpd.conf.
E' possibile?
Stando a questo commento presente in httpd.conf, sembra di no:
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here.  Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
CustomLog /var/log/apache/access_log combined
-- 
Non tocca a noi dominare tutte le maree del mondo,
il nostro compito ï¿œ di fare il possibile per la
salvezza degli anni nei quali viviamo,
sradicando il male dai campi che conosciamo.

 mantenendo anche la suddivisione per vhost?
Sfruttando l'opzione %v, puoi fare il contrario, ovvero fai loggare
tutto in un unico file e poi splitti:
http://httpd.apache.org/docs/2.0/logs.html#virtualhost
http://httpd.apache.org/docs/2.0/programs/other.html

 tutto in un unico file e poi splitti:
non posso, i log li devo salvare già splittati, con in più
un ulteriore file di aggregato.
Non posso far diversamente.
Posso provare ad inserire una seconda direttiva CustomLog in
ciascun vhost e far loggare due volte, ma non credo funzionerà.
-- 
Non tocca a noi dominare tutte le maree del mondo,
il nostro compito è di fare il possibile per la


 ciascun vhost e far loggare due volte, ma non credo funzionerà.
Dubito, ma la vita è piena di sorprese.

 viene in mente.
Il problema grosso è che il server è in produzione e non posso
fare sperimenti.
uno dei due log, ovvero l'aggregato, sarà già una pipe di per se,
voglio evitare di andare a smanettare anche sui log singoli, altrimenti
i clienti mi ammazzano.
Mi sa che mi conviene centralizzare i log da subito, evitando lo
split per vhost, loggare direttamente in una singola pipe che mi
spara il log ad un server rsyslog remoto, poi su tale server splitto
per vhost in base al contenuto di %v.
Questo è l'obiettivo, ma preferivo arrivarci con un metodo meno tragico
ovvero tenere in simultanea i due sistemi di logging per qualche giorno,
poi andare a disattivare il log per singolo vhost lasciando solo il
centralizzato.
Almeno ho una sorta di fallback in caso di problemi. Se stacco i singoli
log (che funzionano) per un sistema che funziona solo sulla carta dato
che non l'ho ancora implementato su tale server, e qualche cosa non
va, la mia testa salta per aria.


 
non so se usi il logrotate di apache o il logrotate di linux e non so
se hai necessità di eseguire questa operazione in tempo reale o se va
bene cadenzarla. Il logrotate di apache non ricordo bene come funziona.
Con il logrotate di Linux puoi aggiungere una azione postrotate con
gzcat .... dipende dalle tue esigenze.
-- 
echo onailimissaM | awk 'BEGIN { FS = "" }
{ for (i = NF; i >= 1; i-- )
  printf $i }'; echo


si ma ... @"£@!!!###£££ .... venire qui a cercare consigli e poi dire,
si però, si ma, ma comunque, ma però .... nessuno su questo NG ha mai
detto a qualcun altro di fare prove direttamente in produzione.
O meglio, nessuno ha mai detto questo e nemmeno il contrario di questo.
Qui si danno consigli su come fare le cose e basta.
Sarà tua premura fare le tue prove in ambiente di test e una volta
verificato il corretto funzionamento riporterai il tutto in ambiente di
produzione.


 un solo file "generale" mantenendo l'ordine temporale.
E si, ne ho fatto uno anche io, il problema è che mi serve un log
in realtime, altrimenti sarebbe facile aggregarlo a posteriori.

 E' possibile?
Per queste cose, e anche per altro per la verità, personalmente prediligo
loggare su syslog.
Per farlo è banale; in httpd.conf (o equivalente) come custom-log (o
access-log o error-log) ci metti logger in pipe.
Per esempio io uso local5 come facility e loggo con program name uguale al
dominio e priority info o error in base al tipo di messaggio.
ErrorLog "|/usr/bin/logger -p local5.err -t 
http_www.zipman.it
"
CustomLog "|/usr/bin/logger -p 
local5.info
 -t 
http_www.zipman.it
" combined
Poi con rsyslog puoi fare quel che vuoi. Per esempio io eseguo la rotazione
automatica alla mezzanotte precisa (e comprimo tramite un job a cron) ma
ovviamente tu puoi fare quel che vuoi...
Nel tuo caso per esempio potrebbe essere una cosa così:
$template
VHostAccess,"/var/log/apache2/%$YEAR%-%$MONTH%/%$DAY%/%syslogtag:F,58:1%_access.log"
$template
VHostError,"/var/log/apache2/%$YEAR%-%$MONTH%/%$DAY%/%syslogtag:F,58:1%_error.log"
$template
ApacheAccess,"/var/log/apache2/%$YEAR%-%$MONTH%/%$DAY%/vhost_combined_access.log"
$template
ApacheError,"/var/log/apache2/%$YEAR%-%$MONTH%/%$DAY%/vhost_combined_error.log"
$template ApacheLog,"%msg:2:$:drop-last-lf%\r\n"
local5.*	@server_di_archiviazione
local5.=info	-?VHostAccess;ApacheLog
local5.=info	-?ApacheAccess;ApacheLog
local5.=info	~
local5		-?VHostError;ApacheLog
local5		-?ApacheError;ApacheLog
local5		~
In questo esempio vengono creati i files
/var/log/apache2/ANNO-MESE/GIORNO/http_nomesito1.xxx_access.log
/var/log/apache2/ANNO-MESE/GIORNO/http_nomesito1.xxx_error.log
/var/log/apache2/ANNO-MESE/GIORNO/http_nomesito2.xxx_access.log
/var/log/apache2/ANNO-MESE/GIORNO/http_nomesito2.xxx_error.log
/var/log/apache2/ANNO-MESE/GIORNO/vhost_combined_access.log
/var/log/apache2/ANNO-MESE/GIORNO/vhost_combined_error.log
Con gli ultimi 2 che contengono tutti i vhost. La rotazione è automatica
ogni giorno *esattamente* alla mezzanotte e senza necessità di riavviare il
webserver, basta che ti ricordi di crearti uno script che comprima i log
vecchi e che magari cancelli quelli più vecchi di un tot (essendo
memorizzati in directory datate è cosa semplice).
-- 
Flavio Visentin
Ubuntu in Zulu significa "Non so usare Debian". (cit. CtRiX)

 produzione.
Il punto è diverso.
Ho un server in produzione che non posso spegnere per fare prove
(altrimenti il problema non sussisterebbe) e stavo chiedendo, nel
caso qualcuno l'avesse già fatto, se fosse possibile mettere due
direttive CustomLog, una generale ed una dentro il vhost.
Mi sono risposto da solo guardando la documentazione di apache, e
non è possibile, ma magari esiste un metodo migliore.
Se tu hai un metodo migliore e già testato come funzionante, bene, 
mi piacerebbe saperlo, in caso contrario farò delle prove per conto
mio, ovviamente.
Va da se che non posso simulare i 10-15mbit di traffico sul server
in produzione su di un testbed senza perdere 3 giorni di implementazione
usando pipe che potrebbero non reggere il traffico definitivo, 
pertanto se esiste un metodo più rapido tipo:
"Metti 2 direttive CustomLog dentro il vhost e risolvi" mi farebbe
piacere conoscerlo.
Tutto nasce dal fatto che non ho fisicamente 3 giorni per fare test,
visto che ho una scadenza per le ore 12 di domani. 
Se esiste un metodo funzionante al 100% mi piacerebbe saperlo altrimenti
come workaround aggregherò i log ogni X minuti/ore
Sai com'è, magari qualche lettore tra i propri appunti ha proprio la
soluzione al mio problema.

 access-log o error-log) ci metti logger in pipe.
E' *esattamente* quello che devo fare io.
Il problema è che oltre al log remoto devo loggare (splittato) in
locale.
Il log remoto sostituirà il log locale, ma settimana prossima, per
ora devo fare il doppio log e non ho idea di come fare.
O loggo tramite pipe, o loggo splittato, visto che apache prende una
sola direttiva CustomLog (o dentro il vhost, o dentro il generale)

 sola direttiva CustomLog (o dentro il vhost, o dentro il generale)
Rileggiti bene la soluzione e studiati rsyslog (o syslog-ng se preferisci).


 ciascun vhost e far loggare due volte, ma non credo funzionerà.
Funziona!
Direi che ho risolto.
Mi metto due CustomLog in ciascun vhost, uno logga su file come
di consueto, l'altro spara in pipe a logger, trasmettendo anche
il nome del vhost.
Logger remotizza sul server rsyslog.
Quando tra qualche giorno vedo che tutto funziona, rimuovo la
direttiva che logga su singolo file (o meglio, la lascio uguale
ma con logrotate rimuovo tutto ciò che è più vecchi di 7 giorni)
Ho risolto! Grazie comunque.

 Rileggiti bene la soluzione e studiati rsyslog (o syslog-ng se preferisci).
rsyslog già lo uso, mi hai mandato te un pezzo di esempio tempo fa :)

 il nome del vhost.
Fai loggare tutto a syslog. Una volta che il messaggio è nella coda del
syslog è molto meglio delegare a quest'ultimo la scrittura su disco, e puoi
farlo su 10000 files diversi senza problemi.
Così non vincoli apache a loggare anche su file, cosa che richiede il
riavvio ad ogni rotazione.


 riavvio ad ogni rotazione.
Si, ma per i prossimi 7 giorni.
Apache non loggerà più su file ma solo in remoto tramite syslog.
Il doppio log avrà vita di massimo 1 settimana.

 esterno, sempre e comunque)
Il loggare su server esterno è quello che sto cercando di attuare
ma al momento (qualche giorno) non posso smettere di loggare in locale.
Pertanto, devo aggiungere una direttiva CustomLog che mi permetta di
inviare *anche* ad un server remoto *oltre* che loggare in locale con
l'attuale direttiva CustomLog.
In pratica loggo 2 volte per ciascun vhost, per una settimana massimo,
poi la vecchia direttiva CustomLog locale la rimuovo lasciando solo
quella remota.
-- 
Non tocca a noi dominare tutte le maree del mondo,
il nostro compito è di fare il possibile per la
