web-dev-qa-db-fra.com

Comment tronquer tous les fichiers journaux?

quelqu'un peut-il me donner une solution pour tronquer tous les fichiers journaux dans le répertoire /var/log/?

et une question juste pour la connaissance, est-ce une bonne idée ou pas?

#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
  truncate -s 0 $logfile
done
16
pylover

essaye ça:

truncate -s 0 /var/log/*log

MODIFIER:

si vous souhaitez effectuer cette opération plusieurs fois, vous devez utiliser logrotatepour gérer vos journaux. Habituellement, il est installé à Ubuntu. Regardez man logrotate (ou si vous ne l'avez pas déjà installé, regardez la page de manuel en ligne ou installez-le avec Sudo apt-get install logrotate)

depuis la page de manuel:

logrotate est conçu pour faciliter l'administration de systèmes générant un grand nombre de fichiers journaux. Il permet une rotation, une compression, une suppression et un envoi automatiques des fichiers journaux. Chaque fichier journal peut être traité quotidiennement, hebdomadairement, mensuellement ou lorsqu'il devient trop volumineux.

32
D-E-N

Si vous souhaitez effacer tous vos fichiers journaux, et pas seulement ceux du dossier journal de premier niveau, vous pouvez utiliser:

shopt -s globstar                  # if needed
truncate -s 0 /var/log/*.log       # first-level logs
truncate -s 0 /var/log/**/*.log    # nested folders, like /var/log/nginx/access.log

En notant que si vous avez déjà logrotate en cours d'exécution, vous devez également effacer les journaux .gz pivotés:

find /var/log -type f -name '*.[0-99].gz' -exec rm {} +

Une utilisation valide de ceci pourrait être la construction d'un conteneur d'appareils VM à des fins de distribution, par exemple.

Vous devriez pas avoir besoin de faire cela dans le cadre de la maintenance de routine: comme D-E-M l'a suggéré assez correctement, utilisez logrotate pour cela.

10
msanford

En guise de suivi de @ D-E-N answer

Cela trouvera tous les fichiers journaux dans /var/log et les tronquera à 0 octet.

find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
1
Luka

Il est recommandé de faire pivoter les journaux dans/var/logs afin de les faire pivoter avec la fonctionnalité logrotate, mais pas à tout moment. Les journaux système seront imprimés et ils seront pratiques pour déboguer les défaillances.

Si vous ne devez pas utiliser logrotate, vous pouvez explorer des options. Bien que l'option tronquer soit une option facile dans quelques versions de système unix, cette commande n'est pas disponible facilement, elle doit être installée. Si vous n'êtes pas autorisé à installer la nouvelle commande, vous pouvez utiliser la boucle ci-dessous.

for logfile $(ls /path/*.log)
do 
  cat /dev/null > $logfile
done
0
Devoloper250

Il existe plusieurs méthodes pour tronquer complètement un fichier, généralement applicable à la plupart des systèmes d'exploitation compatibles POSIX. Le plus souvent, vous verrez que les scripts Shell ont quelque chose comme true > file.txt ou : > file.txt (et dans le cas de bash Shell, la redirection de > suffit à elle seule). Cela est dû à la façon dont > ouvre les fichiers via open() ou openat() syscall avec O_WRONLY|O_CREAT|O_TRUNC flags - qui lit en écriture seule OR create si le nom de fichier n'existe pas, OR tronquer le nom de fichier existant.

Dans cet esprit, nous pouvons implémenter quelque chose comme ça en C nous-mêmes:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv){
    if (argc == 2){
        int fd = open(argv[1],O_TRUNC);
        close(fd);
    }

    return 0;
}

Nommez le fichier qui stocke ce code sous la forme trunc.c et compilez-le avec gcc trunc.c -o trunc. Vous aurez ainsi un petit utilitaire qui tronquera un argument de nom de fichier fourni comme dans trunc ./foobar.txt. Bien sûr, ce code ne fait pas d’autres vérifications, il ne fait que tronquer le premier paramètre de position. Je laisserai aux lecteurs le soin de comprendre comment traiter plus d’un paramètre de position. Sur la note de côté, il y a truncate() syscall que nous pourrions également utiliser, et tronquer un fichier à une longueur variable.

Maintenant, si vous n'êtes pas un fan de C, Python pourrait être plus facile pour vous. La commande open() fonctionne sur le même principe que dans Python - ouverture du fichier pour écriture et troncation si le nom de fichier existe. Ainsi on peut faire

python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy 

En ce qui concerne la recherche de tous les fichiers .log, cela a déjà été couvert dans d'autres réponses - utilisez * glob ou extended glob dans bash. Il y a aussi find -type f -name "*.log", qui a le drapeau -exec pour les commandes en cours (dans ce cas particulier, sh -c '' pour tirer parti de > car > est un opérateur Shell et non un exécutable externe). Ainsi tu peux faire

find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;

Il est également intéressant de noter que les fichiers journaux du répertoire tels que /var/log sont souvent pivotés par le service logrotate. Il existe donc des noms de fichiers tels que /var/log/service.log, /var/log/service.log.1, etc., de sorte que vous pouvez utiliser plutôt le modèle *.log.[1-9].


Entre autres choses, nous pouvons copier /dev/null dans le fichier souhaité. Curieusement, même si /dev/null est un type de fichier avec un caractère spécial, lorsque vous copiez ce fichier ailleurs, le résultat est un fichier normal vide, au moins avec GNU cp. Ainsi on peut faire

cp /dev/null foo.txt

ou

dd if=/dev/null of=foo.txt

Autre lecture suggérée:

0
Sergiy Kolodyazhnyy