Как обрезать все лог-файлы?

18

Кто-нибудь может дать мне решение обрезать все файлы журнала в /var/log/каталоге?

и вопрос только для знания, это хорошая идея или нет?

#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
  truncate -s 0 $logfile
done
pylover
источник
1
Это НЕ хорошая идея - /var/logэто то, где система помещает сообщения, которые вам могут понадобиться позже. Ubuntu сталкивался с проблемой раньше. Читать man 8 logrotate;man logrotate.conf.
вальтинатор

Ответы:

34

попробуй это:

truncate -s 0 /var/log/*log

РЕДАКТИРОВАТЬ:

если вы хотите сделать это более одного раза, вы должны использовать logrotateдля обработки ваших журналов. Обычно он устанавливается в Ubuntu. Посмотрите man logrotate(или, если у вас не установлено приложение, посмотрите онлайн-страницу руководства или установите его с помощью sudo apt-get install logrotate)

с man-страницы:

logrotate предназначен для упрощения администрирования систем, которые генерируют большое количество файлов журналов. Это позволяет автоматически вращать, сжимать, удалять и отправлять файлы журналов по почте. Каждый файл журнала может обрабатываться ежедневно, еженедельно, ежемесячно или когда он становится слишком большим.

DEN
источник
также вы можете очистить их, используя echo ""> * log
Astm
10

Если вы хотите очистить все файлы журналов, а не только те, которые находятся в папке журналов первого уровня, вы можете использовать:

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

Обратите внимание, что если у вас уже есть logrotateзапущенный, вам также необходимо очистить повернутые .gzлоги:

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

Допустимое использование для этого может быть, например, создание контейнера устройства VM для распространения.

Вам не нужно делать это как часть обычного обслуживания: как правильно предположил DEM, используйте logrotateдля этого.

msanford
источник
1

Как следить за ответом @DEN

Это позволит найти все файлы журнала /var/logи обрезать их до 0 байтов.

find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
Luka
источник
1
Я бы использовал *.log*вместо этого, но я не уверен, что это на 100% безопасно, поэтому я не включил его в ответ. Потому что есть файлы, как dovecot.log-20180930и dovecot.log-20180923.gz.
Лука
0

Существует несколько методов полного усечения файла, обычно применимых к большинству POSIX-совместимых ОС. Чаще всего вы видите сценарии оболочки - это что-то вроде true > file.txtили : > file.txt(и в случае bashоболочки >достаточно только перенаправления). Это связано с тем, как >файлы открываются с помощью open()или openat()системным вызовом с O_WRONLY|O_CREAT|O_TRUNCфлагами - это чтение только для записи, ИЛИ создание, если имя файла не существует, ИЛИ обрезание существующего имени файла.

Имея это в виду, мы можем реализовать что-то подобное в C:

#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;
}

Назовите файл, в котором хранится этот код, trunc.cи скомпилируйте его gcc trunc.c -o trunc, и у вас есть небольшая утилита, которая усекает аргумент имени файла, который он предоставляет, как в trunc ./foobar.txt. Конечно, этот код не выполняет другие проверки, он только усекает первый позиционный параметр. Я оставлю это на усмотрение читателей, чтобы выяснить, как обращаться с более чем одним позиционным параметром. Кроме того, есть truncate()системный вызов, который мы также можем использовать и обрезать файл до переменной длины.

Теперь, если вы не фанат C, Python может быть проще для вас. open()Команда работает по тому же принципу в Python - открытие файла для записи и усечения, если имя файла существует. Таким образом, мы можем сделать

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

Что касается поиска всех .logфайлов, это уже было рассмотрено в других ответах - используйте *glob или extended glob bash. Также find -type f -name "*.log"есть -execфлаг , который запускает команды (в данном конкретном случае sh -c ''использовать это преимущество, >потому что >это оператор оболочки, а не внешний исполняемый файл). Таким образом, вы можете сделать

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

Также стоит отметить, что файлы журнала в каталоге, такие как /var/logчасто, вращаются сервисом logrotate, поэтому будут имена файлов, такие как /var/log/service.log, /var/log/service.log.1и т. Д., Так что вы можете использовать *.log.[1-9]шаблон вместо


Среди прочего мы можем скопировать /dev/nullв нужный файл. Как ни странно, несмотря на то, /dev/nullчто это файл с символьным типом устройства, когда вы копируете его в другое место, результатом будет пустой обычный файл, по крайней мере с GNU cp. Таким образом, мы можем сделать

cp /dev/null foo.txt

или

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

Другое предлагаемое чтение:

Сергей Колодяжный
источник
0

Хорошей практикой является вращение журналов в / var / logs для вращения с функциональностью logrotate, но не всякий раз, когда мы этого хотим. Системные журналы будут распечатаны ей и они пригодятся для отладки любых сбоев.

Если требуется не использовать logrotate, то варианты можно изучить. Хотя усечение является простой опцией в некоторых разновидностях Unix-системы, эта команда недоступна, ее необходимо установить. Если не разрешено устанавливать новую команду, то можно использовать цикл ниже.

for logfile $(ls /path/*.log)
do 
  cat /dev/null > $logfile
done
Devoloper250
источник
Подводный камень Bash # 1 : Не пишите для циклов таким образом. Используйте for logfile in /path/*.logвместо этого.
PerlDuck