Journal d'accès «Catch-All» avec les hôtes virtuels Apache?

16

J'ai de nombreux hôtes virtuels installés sur un serveur Web, chacun ayant son propre journal d'erreurs et d'accès. Les lignes pertinentes de httpd.confquelque chose comme ceci:

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

Actuellement, j'obtiens des erreurs aléatoires dans /var/log/httpd-error.log, mais je n'obtiens rien dans /var/log/httpd-access.log. Est-il possible d'avoir TOUS les accès et les erreurs dupliqués dans un fichier journal partagé? Est-il possible de le faire sans ajouter de nouvelles entrées à chaque VirtualHost?

pix0r
la source

Réponses:

17

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

Si les directives CustomLog ou ErrorLog sont placées dans une section, toutes les demandes ou erreurs pour cet hôte virtuel seront enregistrées uniquement dans le fichier spécifié. Tout hôte virtuel qui n'a pas de directives de journalisation verra toujours ses demandes envoyées aux journaux du serveur principal.

En d'autres termes, si vous placez des directives de journalisation dans une section VirtualHost, cela remplacera les directives de journalisation dans la configuration du serveur principal. Si vous souhaitez vous connecter à un seul fichier journal, supprimez la configuration du journal de vos sections VirtualHost.

Par souci de simplicité, je préfère consigner toutes les données Access dans un seul fichier journal. Plus tard, vous pouvez traiter les journaux et diviser les fichiers journaux en fichiers journaux pour les hôtes virtuels. En outre, l'écriture dans un seul fichier journal est une utilisation plus efficace des ressources informatiques que l'écriture dans 30 fichiers journaux à la fois. Assurez-vous simplement que votre LogFormat inclut le '% v', qui enregistrera le nom de l'hôte virtuel.

Est-il possible d'avoir TOUS les accès et les erreurs dupliqués dans un fichier journal partagé?

Vous pouvez enregistrer toutes les erreurs et accéder à un fichier journal partagé, mais le fichier journal est moche. Tout d'abord, envoyez les données du journal Apache à syslog, puis utilisez syslog pour envoyer à un fichier local ou à un serveur de journal distant.

# 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

Et puis dans /etc/syslog.conf

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

J'ai ajouté une deuxième ligne CustomLog dans la section VirtualHost. Mais je devais le faire pour chaque fichier vhost conf. Cela fonctionne et il est maintenant dans mon modèle, donc les nouveaux vhosts sont pris en compte.

Mon apache2 enregistre désormais les hits à deux endroits:

  1. Les détails d'un vhost dans le répertoire de ce vhost et
  2. à /var/log/apache2un fichier combiné pour tous les serveurs virtuels.

J'applique un LogFormat différent à chacun de ces deux journaux pour les adapter respectivement, bien sûr. Le /var/log/apache2journal est analysé avec Perl et aspiré dans une structure MySQL hautement normalisée pour l'analyse et la génération de rapports. Logrotate balaie une fois par semaine.

pholt
la source
1

Eh bien, si vous voulez simplement voir les journaux en direct en un seul endroit pour tous les hôtes virtuels, vous pouvez simplement taper:

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

la même règle s'applique pour chat avec grep:

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

ou si la rotation du journal a déjà compressé les fichiers:

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

des exemples sont testés sur Debian / Ubuntu

troyen
la source
0

Je ne pense pas que ce soit possible. Au moins, la documentation ne mentionne pas une telle chose.

Le meilleur moyen de simuler ce type de comportement consiste à définir la balise% v au format et, lors de la rotation des journaux, à fractionner une copie des fichiers journaux en fichiers spécifiques à l'hôte virtuel.

Kimvais
la source
0

Je ne sais pas si les emplacements de vos fichiers journaux suivent une sorte de modèle à travers les hôtes virtuels, mais s'ils le font, j'oublierais qu'Apache crée un journal en double et ne catalyse les journaux que lorsque j'en ai besoin.

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

Je cherche également une réponse à cette question. Jusqu'à présent, j'ai deux solutions:

  1. la solution de chat mentionnée par joebert
  2. ma propre solution de queue: tail -f /var/log/httpd/*access_log

Je veux pouvoir voir une tail -fsorte de vue sur toutes les activités du serveur Web sur l'hôte. Je préférerais de loin pouvoir ne tailler qu'un seul fichier, car je n'aime pas vraiment la façon dont tail gère plusieurs fichiers.


la source
Obtenez multitail. C'est assez utile.
jusqu'au
0

Vous avez 2 possibilités en utilisant la directive ErrorLog http://httpd.apache.org/docs/2.2/mod/core.html#errorlog

1) Utilisez syslog et gérez la duplication dans [r] syslog.conf

2) Utilisez pipe, envoyez l'entrée de journal à une application / script et gérez la duplication dans cette application / script

lrosa
la source
0

La surveillance de tous les journaux d'accès est-elle strictement nécessaire? Si les erreurs sont réellement provoquées par une demande de vhost, quelque chose doit être enregistré dans le journal des erreurs de vhost. Dans ce cas, ls -t /var/www/*/log/error.log pour déterminer quel vhost est le coupable, puis regarder uniquement ce fichier journal d'accès semble être une bonne première étape pour éliminer beaucoup de lecture de journal inutile. .

Jeremy M
la source