Comment tronquer tous les fichiers journaux?

18

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

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

#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
  truncate -s 0 $logfile
done
pylover
la source
1
Ce n'est PAS une bonne idée - /var/logc'est là que le système place les messages dont vous pourriez avoir besoin plus tard. Ubuntu a déjà rencontré le problème. Lisez man 8 logrotate;man logrotate.conf.
waltinator

Réponses:

34

essaye ça:

truncate -s 0 /var/log/*log

ÉDITER:

si vous souhaitez effectuer cette opération plusieurs fois, vous devez utiliser logrotatepour gérer vos journaux. Habituellement, il est installé dans ubuntu. Jetez un œil à man logrotate(ou si vous ne l'avez pas installé, regardez la page de manuel en ligne ou installez-la avec sudo apt-get install logrotate)

à partir de la page de manuel:

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

TANIÈRE
la source
vous pouvez également les vider en utilisant echo ""> * log
Astm
10

Si vous souhaitez effacer tous vos fichiers journaux, 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

Notant que si vous avez déjà logrotateexécuté, vous devrez également effacer les .gzjournaux tournés :

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

Une utilisation valide pour cela pourrait être la construction d'un conteneur d'appliance VM pour la distribution, par exemple.

Vous ne devriez pas avoir besoin de le faire dans le cadre de la maintenance de routine: comme DEM l'a suggéré correctement, utilisez logrotate-le.

msanford
la source
1

Comme suite à la réponse @DEN

Cela trouvera tous les fichiers journaux /var/loget les tronquera à 0 octet.

find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
Luka
la source
1
J'utiliserais à la *.log*place mais je ne sais pas si c'est 100% sûr, donc je ne l'ai pas inclus dans la réponse. Parce qu'il y a des fichiers comme dovecot.log-20180930et dovecot.log-20180923.gz.
Luka
0

Il existe deux méthodes pour tronquer complètement un fichier, généralement applicables à la plupart des systèmes d'exploitation compatibles POSIX. Le plus courant que vous verrez avec les scripts shell est quelque chose comme true > file.txtou : > file.txt(et dans le cas du bashshell, la >redirection seule est suffisante). Cela est dû à la façon dont les >fichiers sont ouverts via open()ou openat()syscall avec des O_WRONLY|O_CREAT|O_TRUNCindicateurs - qui lit en écriture seule OU crée si le nom de fichier n'existe pas, OU tronque 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 trunc.cet compilez-le avec gcc trunc.c -o trunc, et vous avez vous-même un petit utilitaire qui tronquera un argument de nom de fichier tel qu'il est fourni trunc ./foobar.txt. Bien sûr, ce code ne fait pas d'autres vérifications, il tronque uniquement le premier paramètre positionnel. Je laisse aux lecteurs le soin de comprendre comment gérer plus d'un paramètre positionnel. En parallèle, il existe un truncate()appel système que nous pourrions également utiliser et tronquer un fichier à une longueur variable.

Maintenant, si vous n'êtes pas fan de C, Python pourrait être plus facile pour vous. open()La commande fonctionne sur le même principe en Python - ouvrir un fichier pour écrire et tronquer si un nom de fichier existe. Ainsi nous pouvons faire

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

Quant à trouver tous les .logfichiers, cela a déjà été couvert dans d'autres réponses - utilisez *glob ou glob étendu bash. Il y a aussi find -type f -name "*.log", qui a -execdrapeau pour les commandes en cours d' exécution (dans ce cas particulier sh -c ''pour tirer parti de >cause >est un opérateur shell et non un exécutable externe). Ainsi vous pouvez 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 dans le répertoire tels que /var/logsouvent sont mis en rotation par le service logrotate, donc il y aura des noms de fichiers tels que /var/log/service.log, /var/log/service.log.1, etc., de sorte que vous pouvez utiliser *.log.[1-9]modèle à la place


Entre autres choses, nous pouvons copier /dev/nulldans le fichier souhaité. Curieusement, même s'il /dev/nulls'agit d'un type de fichier de périphérique à caractère spécial, lorsque vous copiez cela ailleurs, le résultat est un fichier normal vide, au moins avec GNU cp. Ainsi nous pouvons faire

cp /dev/null foo.txt

ou

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

Autre lecture suggérée:

Sergiy Kolodyazhnyy
la source
0

Il est recommandé de faire pivoter les journaux dans / var / logs pour effectuer une rotation avec la fonctionnalité logrotate, mais pas chaque fois que nous le souhaitons. Les journaux système lui seront imprimés et ils seront pratiques pour déboguer les éventuels échecs.

S'il est nécessaire de ne pas utiliser logrotate, des options peuvent être explorées. Bien que tronquer soit une option facile dans quelques versions du système Unix, cette commande n'est pas disponible facilement, doit être installée.Si elle n'est pas autorisée à installer la nouvelle commande, la boucle ci-dessous peut être utilisée.

for logfile $(ls /path/*.log)
do 
  cat /dev/null > $logfile
done
Devoloper250
la source
Bash Pitfall # 1 : N'écrivez pas pour les boucles de cette façon. Utilisez for logfile in /path/*.logplutôt.
PerlDuck