Как обрезать все файлы журнала?

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

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

17
задан 9 February 2019 в 04:50

5 ответов

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

truncate -s 0 /var/log/*log

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

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

со страницы руководства:

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

0
ответ дан 9 February 2019 в 04:50

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

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

Отметив, что если у вас уже есть [ 112] во время работы вам нужно будет также очистить повернутые журналы .gz:

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

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

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

0
ответ дан 9 February 2019 в 04:50

В ответ на @ D-E-N ответ

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

find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
0
ответ дан 9 February 2019 в 04:50

Существуют методы пары к полностью усечению файла, обычно применимого к самой совместимой POSIX ОС. Наиболее распространенный то, что Вы будете видеть со сценариями оболочки, является чем-то как true > file.txt или : > file.txt (и в случае bash оболочка, > одно только перенаправление достаточно). Это происходит из-за пути как > открывает файлы через open() или openat() syscall с 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() syscall, который мы могли использовать также и усечь файл к переменной длине.

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

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

Что касается нахождения всех .log файлы, это уже было охвачено в других ответах - использование * шарик или расширенный шарик в 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
ответ дан 9 February 2019 в 04:50

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

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

for logfile $(ls /path/*.log)
do 
  cat /dev/null > $logfile
done
0
ответ дан 15 October 2019 в 09:46

Другие вопросы по тегам:

Похожие вопросы: