9
votes

Écrire au fichier Apache Access_log avec PHP

J'ai besoin d'écrire des données statistiques sur le fichier Access_log Live Apache Access_log (j'ai un autre processus de comptage de lignes spécifiques dans le fichier Access_log qui rapporte périodiquement à un autre processus).

actuellement, je force simplement une entrée dans le fichier Access_log En procédant comme suit: PHP: xxx

logme.php ne fait rien et retourne vide avec un succès de 200 succès.

Le problème avec la technique ci-dessus est que Pour chaque demande au serveur Apache, une autre est générée pour écrire sur le journal des serveurs Apache requis.

Lorsque les serveurs s'accumulent, l'appel local simple et généralement rapide au serveur Apache prend plus de 5 ans. secondes.

Puis-je écrire directement sur le fichier Access_log sans causer des problèmes, ou peut-être même qu'il existe un moyen d'écrire sur le fichier apache_log à l'aide de PHP similaire à syslog () ou d'erreur_log ()?


7 commentaires

Cette odeur de mauvais design. Pourquoi voulez-vous connecter des choses dans le journal d'accès qui ne sont pas vraiment accès? Ne feriez-vous pas mieux d'utiliser un fichier journal dédié pour ces choses?


Les statistiques à l'origine ont été rassemblées dans le fichier journal Apache en temps réel. Comme nos projets ont développé davantage de statistiques étaient nécessaires et sur un niveau conditionnel. Par exemple, bien qu'un chargement de page placerait une simple entrée dans l'Access_log comme d'habitude, les choses se produiraient dans certaines circonstances et que ce n'aurait alors pas besoin d'être enregistré. Il existe un processus qui "écoute" au fichier Access_log pour les signaux et cette information est envoyée à des serveurs externes. Cela pourrait devenir très désordonné avoir plusieurs fichiers journaux à traiter.


@Chris Cela peut être possible en quelque sorte - si PHP fonctionne comme un module Apache, il semble être possible de connecter des erreurs dans error_log par exemple - mais utilise un fichier journal distinct totalement hors de la question? On dirait que cela serait beaucoup plus facile. (Mise à jour: Ah, vous avez étendu votre commentaire répondant à ma question)


Je suppose que je complique les choses en expliquant les circonstances. La question est vraiment "est-ce correcte d'écrire directement sur Access_log - ou existe-t-il un moyen facile d'obtenir le même effet en utilisant php"?


Assez juste. Hmm, peut-être que virtuel () pourrait fonctionner plus rapidement qu'une demande explicite? php.net/manual/fr/funcunction.virtual.php i ne savez pas si ces appels sont connectés


Pour l'instant, je suis arrivé avec une solution. J'écris maintenant à un deuxième fichier et que notre système exclusif "écoute" écoute deux fichiers au lieu de celui de celui-ci. Cela fonctionne et peut être la solution finale - mais c'était bon de mettre ceci là-bas!


Il existe également d'autres méthodes si vous

3 Réponses :


1
votes
<?php
  $h = fopen('/path/to/access_log', 'a');
  fwrite($h, 'Message');
  fclose($h);
?>
Others have already commented about the design. The Apache access_log is for Apache to log accesses, period.I uses about a dozen custom log files in one app for all the different monitoring, performance analysis and forensic purposes. One log file per purpose makes log analysis easier.

4 commentaires

Le problème ne résonne pas que les journaux Apache sont plutôt capables de «ajouter» le fichier Access_log qui est ramassé via notre logiciel d'écoute exclusif.


Par exemple, cliquer sur "index.html" entraînera Access_log obtenir une autre ligne. Mais sur certaines occasions, je dois écrire plus d'informations sur le fichier journal, telles que "Dummy.PHP? User_is_chris" - une requête en deux lignes apparaissant dans Access_log. Notre système "écoute" compte des statistiques sur les rapports d'extrémité à la mouche à un serveur externe toutes les 60 secondes.


Par exemple, je pourrais boucler une image locale et passer des paramètres de cette façon - mais mon problème n'est pas ceci - mon problème est que vous appelez le serveur local dans une demande double des demandes ouvertes. En écrivant des informations supplémentaires directement sur Access_Log, il empêche le gaspillage d'un gestionnaire de serveur Apache en attente.


Parfois, il vous suffit de faire ce que vous devez faire: fwrite () pour accéder à_log.



2
votes

2 commentaires

Nous ne filtrons pas de demandes de page spécifiques, insérant plutôt des statistiques supplémentaires en fonction des circonstances. C'est à dire. Une demande d'une page pourrait entraîner plusieurs choses que nous devons voir.


Il y a un Fonction Apache_Note dans PHP, cette aide-t-elle?



9
votes

Vous pouvez utiliser apache_note ( http://php.net/apache_note ) Pour écrire vos valeurs à une note, utilisez ensuite CustomLog avec logformat (% {note_name} n ) ( http://httpd.apache.org/docs/2.2/mod/mod_log_config.html ) pour enregistrer le Nouvelles clés. Vos programmes qui analysent le journal d'accès peuvent ensuite lire également les nouveaux paramètres de journalisation.


0 commentaires