Existe-t-il un moyen approprié pour effacer les journaux?


65

Je me demandais s'il y avait un moyen approprié pour effacer les journaux en général?

Je suis nouveau sur Ubuntu et j'essaie de configurer Postfix. Le journal en question est /var/log/mail.log. Je me demandais s'il y avait une manière correcte de l'effacer, plutôt que de me laisser y effacer toutes les lignes et de la sauvegarder. Je constate que, parfois, les erreurs ne sont pas écrites immédiatement après que j'ai effacé le journal et que je l'ai sauvegardé.

Note latérale: Je ne parviens pas à configurer Postfix et j'essaie de faciliter la lecture des journaux en espérant que cela puisse m'aider au lieu de devoir faire défiler l'écran au fond.


2
si vous voulez seulement voir la fin du fichier, tail est votre ami. tail /var/log/mail.log pour afficher les 5 dernières lignes. tail -f /var/log/mail.log pour voir toutes les lignes écrites à la fin du fichier.
user9517 prend en charge GoFundMonica le

Réponses:


79

Vous pouvez utiliser:

> /var/log/mail.log

Cela tronquerait le journal sans que vous ayez à modifier le fichier. C'est aussi un moyen fiable de récupérer l'espace. Parfois, les gens commettent l'erreur d'utiliser rm dans le journal, puis de recréer le nom de fichier. Si un autre processus a ouvert le fichier, vous ne récupérez pas d'espace avant que ce processus ne ferme sa gestion et vous pouvez gâcher ses autorisations.

De même, si vous consultez le contenu du journal, vous pouvez utiliser la tailcommande suivante:

tail -f /var/log/mail.log

Ctrl-C va rompre le tailing.


2
/bin/csh(commun pour FreeBSD) sauverait ceci avec "Invalid null command", pendant ce temps zsh(remplacement populaire pour bash) attendrait EOF. Voir serverfault.com/a/381380/67675
poige le

comment puis-je le programmer? mettre la >syntaxe dans crontab n'est pas en cours d'exécution car il se peut qu'il ne la reconnaisse pas comme une syntaxe
ishandutta2007

26

Oui, il existe un moyen approprié: vous n'effacez pas les journaux du tout. Vous les faites pivoter . La rotation implique la commutation de la sortie du journal dans un nouveau fichier, sous le même nom, avec les N fichiers journaux précédents conservés sous un ensemble de N noms de fichiers liés.

La façon dont on fait pivoter les journaux dépend de la façon dont on les écrit en premier lieu. C'est un point souvent négligé. Certaines des réponses ici abordent au moins le problème, en mentionnant que certains programmes de journalisation conservent un descripteur de fichier ouvert pour le fichier journal. La suppression du fichier ne libérera donc pas l’espace, voire ne basculera même pas la sortie vers un nouveau fichier journal.

Si le programme qui écrit le fichier journal multilogprovient du daemontoolspackage , par exemple, vous ne faites absolument rien pour faire pivoter les journaux - pas de scripts manuels, pas de crontravaux. Indiquez simplement multilogque la sortie du journal se trouve dans un répertoire et il conservera lui-même un ensemble de N fichiers journaux automatiquement pivotés et dont la taille est limitée, dans ce répertoire.

Si le programme écrivant les fichiers journaux svlogdprovient du runitpackage , il en va pratiquement de même pour un autre exemple. Vous ne faites rien du tout sauf de pointer l'outil vers un répertoire. Il gérera lui-même un ensemble de N fichiers journaux soumis à une rotation et à une taille automatiquement dans ce répertoire.

Si vous utilisez rsyslogpour écrire des fichiers journaux, vous pouvez indiquer au programme de journalisation de s’arrêter lorsque le fichier journal atteint une certaine taille et d’exécuter un script . Vous devez écrire le contenu du script pour renommer le fichier journal et supprimer les anciens fichiers journaux en fonction des contraintes de taille totale, mais au moins le programme de journalisation a fermé le fichier et mis en pause l'écriture du journal pendant que cela se produit.

L'ancienne syslogdméthode de rotation des journaux, encore attendue par les programmes de journalisation tels que syslog-ng et illustrée par des outils tels que ceux logrotatementionnés djangofandans une autre réponse ici, est un peu plus aléatoire. L'un d'eux exécute un crontravail qui renomme périodiquement les fichiers journaux et redémarre le démon de journalisation (en utilisant le superviseur de démon sous lequel il est exécuté). Le problème avec ceci, bien sûr, est qu’il n’impose pas de limite de taille globale. Pendant les semaines lentes, on peut obtenir N très petits fichiers journaux quotidiens, tandis que les jours chargés, on peut obtenir 1 très gros fichier journal dépassant largement la taille limite.

Voilà pourquoi plus tard et de meilleurs outils comme multiloget svlogdont des options de configuration de la taille de fichier et en fait vérifier le fichier journal se tailles, bien sûr. Le monde a appris que l'interrogation des journaux selon un calendrier comportant des crontravaux, voire un logrotatedémon, laisse les fenêtres invisibles pour la taille, et qu'il s'agit du lieu approprié pour effectuer ces vérifications et pour appliquer de façon aussi stricte les limites de taille définies par l'administrateur les fichiers journaux n’avalent jamais la partition sur laquelle ils sont, c’est dans le programme qui écrit réellement les fichiers.


Quant à rsyslog, il peut être facilement configuré pour s’appuyer sur les noms de fichiers décrits par un "modèle" comprenant, par exemple, YEAR, MONTH et DAY. C’est aussi simple que d’avoir une template(name="DYNmail" type="string" string="/var/log/%$YEAR%/%$MONTH%/%$DAY%/mail.log")directive, suivie d’un if ($syslogfacility-text == 'mail') then -?DYNmail;TraditionalFormat. De cette manière, la rotation des journaux n’est tout simplement pas un problème, du moins quand un fichier par jour est acceptable. Il existe $HOURégalement des volumes de journaux très élevés (nécessitant plusieurs rotations par jour) .
Damiano Verzulli

13

Vous pouvez utiliser cela aussi ..

truncate /opt/package/logs/*.log --size 0

Ici, tous les fichiers journaux dans / opt / package / logs deviendront vides.


Je ne vois pas comment cela pourrait être meilleur que les réponses précédentes.
Kasperd

4
C’est en fait une très bonne réponse et le seul qui réponde directement à la question de savoir s’il existe un moyen approprié de tronquer les fichiers journaux. COMMENT, c'est mieux que les autres réponses, c'est qu'il ne supprime pas le fichier journal, il en met le contenu à zéro correctement. Ainsi, les erreurs d'autorisation et les fichiers journaux manquants qui provoquent une panique chez certains démons ne se produiront pas dans ce cas.
hmedia1

11

Oui, il existe un outil pour Linux appelé LogRotate .


9
Juste une petite correction: il ne s'agit pas d'un service, mais d'un outil fonctionnant généralement à partir du service cron.
RV

10

Si vous effacez le journal pour libérer de l'espace, vous pouvez lui adresser la commande / dev / null, sans interrompre l'écriture des programmes. Ne les supprimez jamais! certains logiciels peuvent se plaindre en arrêtant de travailler ou en ignorant complètement le journal jusqu'au prochain redémarrage

cat /dev/null > /path/to/logfile

# to empty all the logs in a directory
for i in /var/log/*; do cat /dev/null > $i; done

3
Pour effacer les fichiers journaux de manière récursive:for i in $(find /var/log -type f); do cat /dev/null > $i; done
Iurie Malai le

4

Écrasement de contenu court et compatible: : > /dest/file

Mais il y a aussi un appel système truncate (2) et l'outil correspondant d'espace utilisateur truncatesur beaucoup de * NIX'es.


1

Si vous souhaitez conserver le fichier avant de le nettoyer, vous pouvez effectuer les opérations suivantes:

cp /var/log/mail.log /var/log/mail.log.1 && echo -n "" > /var/log/mail.log

Si vous souhaitez rechercher un texte ou un e-mail spécifique dans le journal, vous pouvez utiliser grep. Si vous souhaitez conserver des graphiques sur l'utilisation du courrier, vous pouvez utiliser AWStats.


1

Voici comment je le fais, et ceci est juste pour NGINX, vous pouvez le supprimer pour le faire fonctionner sur tous les fichiers journaux.

# Clear nginx logs.
# @usage delnginxlogs
function delnginxlogs() {
  echo "--------------- ⏲  Clearing logs... ---------------"

  # Clear logs.
  for i in /var/log/nginx/*; do cat /dev/null > $i; done

  echo "--------------- ⏲  Deleting .gz log files... ---------------"

  # Delete .gz files.
  find /var/log/nginx -type f -regex ".*\.gz$" -delete

  echo "--------------- 💯 DONE: NGINX logs cleared ... ---------------"
}

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.