Je voudrais obtenir une rotation des journaux nginx qui:
- fonctionnerait sans logiciel supplémentaire (c'est-à-dire - mieux si sans "logrotate")
- créerait des fichiers tournés avec des noms basés sur la date
La meilleure approche est quelque chose comme PostgreSQL - c'est-à-dire que dans sa variable de configuration log_filename, je peux spécifier le style strftime% Y-% m-% d, et cela changera automatiquement la date (ou l'heure) de connexion.
Une autre approche d'apache - l'envoi de journaux via pipe au programme rotatelogs.
Pour autant que j'ai pu effectuer des recherches, aucune approche de ce type n'existe. Tout ce que je peux faire, c'est d'utiliser logrotate avec l'option dateext, mais il a son propre ensemble d'inconvénients, et je préfère utiliser quelque chose qui fonctionne comme | rotatelogs ou log_filename dans PostgreSQL.
Réponses:
Alors que le monde est divisé sur le fait que l'humble pipe nommée soit amie ou ennemie, c'est probablement la solution la plus simple à votre problème. Il présente quelques inconvénients (en ce sens que vous devez créer les tuyaux à l'avance), mais il élimine le besoin d'un cron et vous permet d'utiliser le filtre de tuyaux de diagraphie de votre choix.
Voici un exemple d'utilisation de cronolog sur
access.log
:/var/log/nginx
, je vais donc y mettre mes tuyaux également. Le nom vous appartient; J'ajoute.fifo
, et c'estaccess.log
, donc le mien sera à/var/log/nginx/access.log.fifo
.Créez un canal nommé pour le fichier journal:
Configurez
nginx.conf
pour pointer le journal vers le canal que vous venez de créer:Modifiez votre script init.d pour démarrer le rotateur de journaux en écoutant le canal avant de démarrer le serveur:
Une ligne de commande similaire serait utilisée
rotatelogs
si vous le préférezcronolog
- voir leurs documents pour la syntaxe.Si votre distrobution en a un
start-stop-daemon
, vous devriez l'utiliser à la place, car il a théoriquement tout savoir spécial sur votre plate-forme, et prendre soin depkill
vous. Enroulez simplement la commande dans un script, et le transmettre comme--exec
àstart-stop-daemon
votreinit.d/nginx
.la source
J'ai écrit un programme simple, datelog, pour diviser les journaux communs en fonction de la date enregistrée, par opposition à l'heure actuelle du système lorsque la ligne de journal est vue par le programme. Cela peut ou non être exactement ce que fait déjà Cronolog ou un autre séparateur de journaux, mais il a été plus rapide d'écrire le mien que de découvrir ce que font les autres.
En utilisant l'année et le mois dans la demande enregistrée, la ligne est ensuite écrite dans un fichier ou un canal qui inclut le YYYYMM calculé à partir des données enregistrées. Oui, c'est quelque peu spécifique pour le format de journal commun. Le premier [est censé délimiter la date. Méfiez-vous des adresses IPv6. :)
Pour l'analyse des journaux, il est important que chaque journal ne contienne vraiment que les demandes pour chaque mois respectif, et chaque journal devrait idéalement être complet pour des résultats d'analyse corrects. Il ne suffit pas de déterminer le nom de fichier en fonction de l'heure actuelle dans le séparateur de journaux, car une demande lente commençant à 23:59:59 se retrouvera ensuite dans le fichier journal pour le mauvais mois.
J'utilise ceci avec nginx au moyen d'un fifo nommé qui est vérifié pour exister avant le démarrage de nginx. Notez qu'il existe un compromis dans le programme entre la détection d'erreurs et la sortie tamponnée, où le journal de données préfère actuellement la sortie tamponnée pour des raisons de performances, alors assurez-vous que votre configuration fonctionne vraiment, en particulier lors de l'utilisation de tubes shell, afin de ne pas perdre de données de journal .
Code source: http://stuge.se/datelog.c
N'hésitez pas à m'envoyer vos commentaires et bien sûr les correctifs!
la source
Vous pouvez y parvenir en utilisant un simple script bash et cron:
Plus de détails sur la configuration de crontab, etc. trouvés ici: Rotation des fichiers journaux Nginx via Cron
la source
Je crains de ne pas vraiment comprendre votre question: comme nginx ne prend en charge aucune rotation de log intégrée, vous devrez choisir quelque chose comme
quelque part dans /etc/cron.daily (vous devez qualifier les noms de fichiers ci-dessus avec des chemins d'accès complets, bien sûr) ou installer les utilitaires apache2 pour avoir accès aux rotatelogs.
la source