Вопрос или проблема
В общем, есть команда (gotop-cjbassi
), которую я запускаю постоянно для мониторинга, и, похоже, она начала вести себя неправильно. После проверки, каждый раз, когда она запускается, systemd-journald
непрерывно записывает эту строку в /var/log/syslog
:
Apr 28 00:13:16 myHostName kernel: [46316.136892] audit: type=1400 audit(1588025596.856:20376494): apparmor="DENIED" operation="open" profile="snap.gotop-cjbassi.gotop-cjbassi" name="/proc/286/cmdline" pid=101679 comm="ps" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
Кроме того, syslog.1
занимает 65 ГБ (в принципе, все свободное место на файловой системе) в настоящее время.
Много обсуждений, которые я видел в сети (1, 2), говорят о logrotate
, но никто не объясняет, как просто использовать его для решения таких ситуаций. (Я даже не совсем понимаю, что означает “ротация”, просто сжимает файлы, но сохраняет все данные? Если да, то это не будет решением)
Я попытался немного почитать руководство, но оно действительно не очень удобно для пользователя. Тем не менее, я попытался выполнить эту команду после перехода в /var/log
:
logrotate -f syslog.1
Предположительно, чтобы принудительно выполнить ротацию. Команда, похоже, была выполнена успешно. Но размер не изменился.
Могу я просто cat /dev/null > syslog.1
?
Если да, то я бы предпочел сделать это: sed -i '/cjbassi/d' ./syslog.1
, но я попробовал, и sed
, похоже, сохраняет временный файл с информацией о том, что удалить, прежде чем удалить это. Так что это мешает мне успешно выполнить эту команду, так как ему нужно хранить размер того же порядка, что и оригинальный файл, что означает несколько гигабайт больше, которые моя файловая система не может разместить, так как она уже заполнена.
Если файл называется syslog.1
, он уже был ротирован. В настоящее время используемый файл журнала — это syslog
.
Если он вам не нужен, просто удалите его. Если он вам все еще нужен, вы можете его сжать, но это также требует свободного места. Поскольку файл должен хорошо сжиматься, вы можете попробовать использовать tmpfs
(основанный на ОЗУ).
Если вы удалите файл и место не освободится, значит, кто-то все еще имеет этот файл открытым.
Да, вы можете > /var/log/syslog.1
, если вам не важно, что находится в файле журнала.
Если вы заботитесь о других содержимом файла, вы можете grep -v snap.gotop-cjbassi.gotop-cjbassi > /var/log/syslogtemp && > /var/log/syslog.1 && mv /var/log/syslogtemp /var/log/syslog.1
, если у вас достаточно свободного места для ваших обычных строк журнала.
Настройки logrotate находятся в /etc/logrotate.conf и /etc/logrotate.d/*
В вашем случае соответствующие настройки, вероятно, будут в /etc/logrotate.d/rsyslog и выглядеть примерно так:
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
Из-за опции ‘delaycompress’ logrotate будет ротировать syslog в syslog.1 без сжатия. В следующий раз, когда logrotate запустится, он переместит syslog в syslog.1 и сожмет syslog.1 в syslog.2.gz. Сжатие, конечно, потерпит неудачу, если у вас не будет достаточно места на диске для получившегося gz-файла.
Ответ или решение
Когда вы сталкиваетесь с проблемой огромного размера файла журнала, такого как /var/log/syslog.1
, который достиг 60 ГБ, важно действовать осторожно, чтобы не потерять необходимые данные. При этом необходимо очистить место на файловой системе, чтобы избежать дальнейших проблем с заполняющейся памятью. Рассмотрим пошаговые рекомендации для безопасного управления файлами журнала.
Шаг 1: Понимание общего процесса ротации журналов
Ротация журналов (log rotation) — это процесс, который управляет созданием, удалением и архивированием файлов журналов. Обычно, ротация настраивается с помощью утилиты logrotate
, что позволяет не только уменьшить общий размер логов, но и сохранить историю логов в виде сжатых архивов.
Шаг 2: Быстрая очистка
Если вы не нуждаетесь в предыдущих записях журнала или в том, что уже зафиксировано в /var/log/syslog.1
, вы можете быстро очистить файл с помощью команды:
> /var/log/syslog.1
Эта команда полностью очищает содержимое файла, освобождая место на диске.
Однако, если вам нужно сохранить часть журнала, следует перейти к следующему шагу.
Шаг 3: Фильтрация ненужных записей
Если вам необходимо оставить другие записи, а удалить только те, что относятся к snap.gotop-cjbassi.gotop-cjbassi
, вы можете использовать следующую команду:
grep -v 'snap.gotop-cjbassi.gotop-cjbassi' /var/log/syslog.1 > /var/log/syslog.temp && mv /var/log/syslog.temp /var/log/syslog.1
Эта команда создаст временный файл, в который запишет все записи из syslog.1
, кроме тех, что вы хотите удалить. После этого временный файл заменит оригинальный.
Шаг 4: Настройка logrotate
Для предотвращения очередных проблем с размером журнала, настройте ротацию файлов с помощью logrotate
. Обычно конфигурация ротации для rsyslog
находится в /etc/logrotate.d/rsyslog
. Примерный файл конфигурации может выглядеть так:
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
compress
delaycompress
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
- rotate 7: хранит 7 файлов журналов.
- daily: выполняет ротацию каждый день.
- missingok: не вызывает ошибки, если файл журнала отсутствует.
- notifempty: не ротирует пустые файлы.
- compress: сжимает файлы журналов после их ротации.
Также убедитесь, что у вас достаточно места на диске, чтобы logrotate
мог сжимать предыдущие файлы журналов.
Шаг 5: Monitoring и Prevention
- Мониторинг: Убедитесь, что вы включили мониторинг системных журналов и отлаживаете программы, которые могут генерировать их в избытке.
- Настройка Application: Если
gotop-cjbassi
генерирует слишком много записей, проанализируйте его конфигурацию и логи или обратитесь к разработчику программы для решения проблемы.
Заключение
Важно разумно подходить к управлению журналами, чтобы избежать затруднений с дисковым пространством и потерей данных. Правильная настройка ротации и регулярная фильтрация ненужных записей помогут поддерживать порядок в системе.