Comment faire une alerte par courriel sur modification d’un fichier

Bonsoir à toutes et à tous.
J’ai un serveur Nginx sur une Debian 11 arm64 (pour l’instant dans le routeur Freebox Delta).
J’utilise pour les statistiques des visites du serveur Matomo avec injection du journal d’accès à Nginx.
Ce que j’aimerais, c’est être prévenu par courriel quand le fichier journal /var/log/nginx/access.log.1 est modifié pour pouvoir l’injecter dans Mamoto (il est modifié lorsque access.log est renommé en access.log.1 périodiquement).
Une personne connait-elle le moyen de le faire ou un tuto ou cela serait expliqué ?
Merci d’avance.

Hello,
As-tu recherché sur le web « Envoyer un mail sous debian en ligne de commande - cli » ou " Send Email in Linux from Command Line"?
Tu trouveras de nombreux exemples.

Bonsoir, PmGs.
Envoyer un courriel, ça je sais faire avec un script.
Édit :
Je crois que j’ai trouvé pour surveiller le fichier avec Watchman.

Je n’avais pas compris que ton pb était la détection de la modification.

Je ne connaissais et donc n’utilise pas watchman mais un simple script fait l’affaire :

  • comparaison de la date de modification du fichier actuel avec celle enregistrée
  • enregistrement de la date de modification du fichier actuel

Parfois, je m’exprime avec les pieds et les pieds ne sont pas faits pour ça.
Je suis tombé sur ce tuto :
https://www.kanjian.fr/comment-surveiller-les-fichiers-sur-votre-serveur-linux.html
Je n’ai pas testé encore.

Bonjour,

Concernant la liaison modification→e-mail, tu peux utiliser incron qui se trouve dans le dépôt rétroporté.

Je ne l’ai jamais utilisé, du coup, dis-moi si ça correspond à ton besoin.

2 J'aime

Je ne pensais pas non plus que ton pb était l’utilisation de cron.

Le texte du lien est bien long pour une simple utilisation de find qui te renvoie le(s) fichier(s) modifié(s) depuis 24h, ce qui n’est pas le besoin que tu as exprimés :slight_smile:

Good, je ne connaissais pas, je vais probablement l’adopter dans le futur et pour @ignace1972

Si c’est l’import des logs nginx dans mamoto dont tu as besoin (si je comprends bien le besoin premier, alors que la modification des logs est en fait le problème XY ), regarde sur ce tutoriel:

car quand le fichier access.log.1 a changé c’est qu’il y a eu rotation des logs. Donc ce tuto qui se base justement sur la rotation des logs devrait faire l’affaire.
si la rotation est plus rapide qu’une fois par jour, alors il suffit de changer la période dans le tuto.

1 J'aime

Bonjour à tous.
PmGs, Cron, c’est ok pour moi.
Avant de tester je vous soumets solution qui me parait bonne d’après ce que j’ai lu sur le lien de Zargos et une recherche complémentaire :

     /var/log/nginx/*.log {
                hourly
                missingok
                rotate 14
                compress
                delaycompress
                notifempty
                create 0744 www-data adm
                sharedscripts
                prerotate
                        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
                                run-parts /etc/logrotate.d/httpd-prerotate; \
                        fi \
                endscript
                postrotate
                        invoke-rc.d nginx rotate >/dev/null 2>&1
                endscript
        }

J’ignore la valeur à donner à rotate (j’ai regardé la doc de Nginx qui donne des liens morts qui m’auraient peut-être permis de le savoir).

J’ai lu que ça ne fonctionnait pas tel quel, je dois copier /etc/cron.daily/logrotate dans /etc/cron.hourly/

Dans mon esprit, ça devrait faire un nouveau access.log.1 à chaque heure pile.

Dans un second temps, un crontab.
sudo crontab -e

#\5 * * * * python3 /opt/matomo/matomo-log-analytics/import_logs.py --config /var/www/html/matomo/config/config.ini.php --url=https://matomo.mon.site.fr --idsite=1 --recorders=8 --enable-http-errors --enable-http-redirects --enable-static --enable-bots /var/log/nginx/access.log.1

S’il y a un access.log.1 toutes les heures pile, j’injecte toutes les heures cinq le nouveau access.log.1 dans Matomo.
Cela devrait me permettre quand je me connecte à Matomo d’avoir l’activité jusqu’à une heure dans le passé.

Si vous voyez des erreurs, ne vous gênez pas.

C’est sur la documentation de logrotate qu’il fallait te documenter :wink: , rotate c’est le nombre de journaux que tu souhaite conserver, passer ce nombre, il supprime le plus ancien lors de la rotation.
En gros c’est la rétention.

Bonsoir, Clochette.
Je te remercie pour ta réponse.
En fait, je souhaiterais que Nginx conserve tous les fichiers.
À ce jour, j’ai access.log et access.log.1 tel quel et 20 fichiers access.log.x compressé soit tous les journaux depuis septembre 2022.
Si j’en crois cette traduction de la manpage, il est possible qu’il envoie par courriel le fichier plutôt que le supprimer.
Je creuserai cela avant de faire quoi que ce soit.
Une autre idée, comme on peut forcer la rotation, je ne change rien à la logrotate. Je fais alors la rotation et l’injection avant d’aller sur Matomo, et déplace les logs compressés sur mon ordinateur.
Cela serait bien.

D’après la configuration de logrotate que tu nous à partager, tu conserves 14 fichiers qui seront compressés après rotation chaque heure.

Si tu veux conserver plus de 14 heures il va falloir le nombre de rétention que tu souhaite conserver ou ne pas chercher à faire autrement que la documentation.

Tu as peur que ton log journalier soit si important ?

Aucun intérêt, tu souhaite simplement importer puis archiver ces données pour Matomo, ça n’a rien à voir avec la rotation de tes logs nginx et leur conservation sur le serveur.

En premier lieu configure correctement ta rotation de log nginx à ta convenance, puis mets en place comme précisé sur le lien que @Zargos t’a fourni l’import dans Matomo.
Nul besoin d’envoi de mail ou de script tordu ou de modifier les rétention ou la rotation de tes logs.

De ce que je vois tu travaillera avec le log de la veille, il faut donc seulement que ce log soit bien présent et représente bien le log journalier de la veille.

Je ne travaille pas exactement avec le log de la veille.
J’ai injecté les journaux access.log.1 à access.log.21.
Depuis, je note la dernière entrée injectée dans Matomo.
Quand j’ai besoin d’aller sur Matomo, je recherche la l’entrée que j’ai noté dans access.log et j’en copie toutes les entrées suivantes dans un fichier que j’injecte dans Matomo.
Je cherche donc une solution plus pratique.
Pour vous donner une idée du rythme actuelle de rotation :

-rw-r----- 1 www-data adm  7,0M  4 mars  15:41 access.log.2.gz
-rw-r----- 1 www-data adm  5,3M  1 févr. 05:50 access.log.3.gz
-rw-r----- 1 www-data adm   13M 12 janv. 04:28 access.log.4.gz
-rw-r----- 1 www-data adm  3,6M  1 déc.  00:00 access.log.5.gz
-rw-r----- 1 www-data adm  4,3M 31 oct.  23:59 access.log.6.gz
-rw-r----- 1 www-data adm  1,2M  1 oct.   2022 access.log.7.gz
-rw-r----- 1 www-data adm  106K 22 sept.  2022 access.log.8.gz
-rw-r----- 1 www-data adm  122K 21 sept.  2022 access.log.9.gz
-rw-r----- 1 www-data adm   96K 20 sept.  2022 access.log.10.gz
-rw-r----- 1 www-data adm   76K 19 sept.  2022 access.log.11.gz
-rw-r----- 1 www-data adm   81K 18 sept.  2022 access.log.12.gz
-rw-r----- 1 www-data adm   91K 17 sept.  2022 access.log.13.gz
-rw-r----- 1 www-data adm  108K 16 sept.  2022 access.log.14.gz
-rw-r----- 1 www-data adm  118K 15 sept.  2022 access.log.15.gz
-rw-r----- 1 www-data adm  104K 14 sept.  2022 access.log.16.gz
-rw-r----- 1 www-data adm   71K 13 sept.  2022 access.log.17.gz
-rw-r----- 1 www-data adm  117K 12 sept.  2022 access.log.18.gz
-rw-r----- 1 www-data adm  192K 11 sept.  2022 access.log.19.gz
-rw-r----- 1 www-data adm  183K 10 sept.  2022 access.log.20.gz
-rw-r----- 1 www-data adm  144K  9 sept.  2022 access.log.21.gz

Oui, le rythme de rotation a changé pourtant, je n’ai rien modifié.
Je pense que je ne vais rien changer à la configuration.
Déplacer les journaux achevés sur mon ordi.
Une fois /var/log/nginx propre,
Dès que j’ai besoin d’aller sur Matomo, je force la rotation,
J’injecte le fichier créé que je déplace sur mon ordi.
C’est pour moi, le plus simple.

C’est justement là pour moi ton problème, si tu te simplifie un peu la vie à mettre une rotation automatique de ton log de façon journalière et que tu script l’import directement dans Matomo comme expliqué quel est ton problème ?

Tu laisse la rotation faire son travail tranquillement pour éviter une saturation et conserver tes logs dans la mesure du nécessaire.
L’import se fera chaque jour dans Matomo sans aucune suppression ou autre chose.

Bonsoir à toutes et à tous.
Je crois que j’ai trouvé la solution qui me convient.
Dans un script shell :
rm /home/ignace/access-nginx/*
sudo logrotate -vf /etc/logrotate.d/nginx
cp /var/log/nginx/access.log.* /home/ignace/access-nginx/
sudo python3 /opt/matomo/matomo-log-analytics/import_logs.py --config /var/www/html/matomo/config/config.ini.php --url=https://matomo.mon.site.fr --idsite=1 --recorders=8 --enable-http-errors --enable-http-redirects --enable-static --enable-bots access-nginx/access.log.1
sudo rm /var/log/nginx/access.log.*

Pour la première fois, faire une sauvegarde des fichiers access.log.1.* avant de lancer le script.

Sur machine locale :
scp id@192.168.x.x:~/access-nginx/* /home/ignace/web/log_nginx/17.04.2023/

Et voilà.