¿Registro de acceso "Catch-All" con los hosts virtuales de Apache?

16

Tengo muchos hosts virtuales configurados en un servidor web, cada uno con su propio error y registro de acceso. Las líneas relevantes de httpd.confson algo como esto:

ErrorLog /var/log/httpd-error.log
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /var/log/httpd-access.log combined

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName myhost.com
    ServerAlias www.myhost.com
    DocumentRoot /var/www/myhost.com/htdocs
    ErrorLog /var/www/myhost.com/log/error.log
    CustomLog /var/www/myhost.com/log/access.log combined
</VirtualHost>

# ... many more VirtualHosts

Actualmente, recibo algunos errores aleatorios en /var/log/httpd-error.log, pero no obtengo nada en /var/log/httpd-access.log. ¿Es posible tener TODOS los accesos y errores duplicados en un archivo de registro compartido? ¿Es posible hacer esto sin agregar nuevas entradas a cada VirtualHost?

pix0r
fuente

Respuestas:

17

Ver http://httpd.apache.org/docs/2.2/logs.html#virtualhost

Si las directivas CustomLog o ErrorLog se colocan dentro de una sección, todas las solicitudes o errores para ese host virtual se registrarán solo en el archivo especificado. Cualquier host virtual que no tenga directivas de registro aún tendrá sus solicitudes enviadas a los registros del servidor principal.

En otras palabras, si coloca directivas de registro dentro de una sección VirtualHost, anulará las directivas de registro dentro de la configuración del servidor principal. Si desea iniciar sesión en un único archivo de registro, elimine la configuración de registro de sus secciones de VirtualHost.

Para simplificar, prefiero registrar todos los datos de Access en un solo archivo de registro. Más tarde, puede procesar los registros y dividir los archivos de registro en archivos de registro para los hosts virtuales. Además, escribir en un único archivo de registro es un uso más eficiente de los recursos informáticos que escribir en 30 archivos de registro a la vez. Solo asegúrese de que su LogFormat incluya el '% v', que registrará el nombre del Host virtual.

¿Es posible tener TODOS los accesos y errores duplicados en un archivo de registro compartido?

Puede registrar todos los errores y acceder a un archivo de registro compartido, pero el archivo de registro es feo. Primero, envíe los datos de registro de Apache a syslog, y luego use syslog para enviar a un archivo local o un servidor de registro remoto.

# Send access logs to syslog
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "|/usr/bin/logger -t httpd -i -p local7.notice" combined
# Send error logs to syslog
ErrorLog syslog:local7

Y luego en /etc/syslog.conf

# Send all HTTP log data to this file
local7.*        /var/log/http-all.log
Stefan Lasiewski
fuente
2

Lo que hice fue agregar una segunda línea CustomLog en la sección VirtualHost. Pero tenía que hacer esto para cada archivo de conf de vhost. Funciona y ahora está en mi plantilla, por lo que se toman nuevos vhosts.

Mi apache2 ahora registra visitas a dos lugares:

  1. Los detalles para un vhost en el directorio de ese vhost y
  2. a /var/log/apache2en un archivo combinado para todos los host virtuales.

Aplico un LogFormat diferente a cada uno de estos dos registros para acomodar respectivamente, por supuesto. El /var/log/apache2registro se analiza con Perl y se absorbe en una estructura MySQL altamente normalizada para análisis e informes. Logrotate barre una vez a la semana.

pholt
fuente
1

bueno, si solo quieres ver registros en vivo en un solo lugar para todos los hosts virtuales, puedes escribir:

tail -f /var/www/*/access.log

La misma regla se aplica para el gato con grep:

 cat /var/www/*/access.log | grep "something"

o si log rotar comprime los archivos ya:

gzip -d /var/www/*/access.log.2.gz

los ejemplos se prueban en Debian / Ubuntu

troyano
fuente
0

No creo que esto sea posible. Al menos la documentación no menciona tal cosa.

La mejor manera de simular este tipo de comportamiento es definir la etiqueta% v en el formato y, en la rotación del registro, dividir una copia de los archivos de registro en archivos específicos del host virtual.

Kimvais
fuente
0

No sé si las ubicaciones de sus archivos de registro siguen algún tipo de patrón en los hosts virtuales, pero si lo hacen, me olvidaría de hacer que Apache cree un registro duplicado y solo capture los registros cuando los necesite.

cat /var/www/*/log/access.log > /var/www/logs/access.log
joebert
fuente
0

Estoy buscando una respuesta a esta pregunta también. Hasta ahora, tengo dos soluciones:

  1. la solución del gato joebert mencionó
  2. mi propia solución de cola: tail -f /var/log/httpd/*access_log

Quiero poder ver una tail -fespecie de vista en toda la actividad del servidor web en el host. Sin embargo, preferiría poder seguir un solo archivo, ya que realmente no me gusta la forma en que tail maneja varios archivos.


fuente
Consigue multitail. Es bastante útil
Hasta el
0

¿Es estrictamente necesario ver todos los registros de acceso? Si los errores realmente son causados ​​por una solicitud de vhost, debe haber algo registrado en el registro de errores de vhost. En ese caso, ls -t /var/www/*/log/error.log para determinar qué vhost es el culpable y luego mirar solo ese archivo de registro de acceso parecería ser un buen primer paso para eliminar muchas lecturas innecesarias de registros .

Jeremy M
fuente