Jump to content
gvan

Ротация логов в entware, записанных на внешний USB-диск

Recommended Posts

Если вы задались задачей собирать логи (журналы работы) системы в отдельный файл, который не стирается после перезагрузки роутера, то, скорее всего, через некоторое время столкнетесь с проблемой, когда размер лога станет занимать значительный объем диска.

Задача по включении системного логирования во внешний лог описывается в соответствующей теме "Запись syslog на внешний USB-диск с помощю Syslog-ng", (автор Roman_Petrov).

Здесь рассмотрим непосредственно механизм ротации логов.

1. Необходимо установить через opkg пакеты logrotate и cron.

Cron нужен для периодического запуска logrotate. А logrotate в свою очередь требуется для проверки необходимости ротации логов и непосредственно их ротации в соответствии с заданными условиями (например, интервал времени и объем). 

С cron могут возникнуть проблемы, если файловая система диска fat или ntfs, т.к. на конфигурационных файлах будут неправильные (с точки зрения linux/cron) атрибуты файлов. И задачи просто не будут запускаться. Решение имеется, но нужно ставить crontab из busybox (п.2).

Второй и третий вариант решения проблемы с cron и ntfs/fat - это изменить файловую систему подключенного диска на ext2 или ext3, либо поставить поддержку opkg на отдельную флэшку (раздел) с ext2/ext3 (если, не хочется возиться с преобразованием основного диска). Для себя я выбрал третий вариант (хотя и на диске с файлами у меня ext3). Но т.к. основной диск у меня используется редко, и я хочу, чтобы он "засыпал" и отключал питание, то все логи пишу на отдельную флэшку (достаточно будет размером 1 Гб).

2. Настраиваем ротацию логов. Основной конф /opt/etc/logrotate.conf не трогаем и делаем отдельную конфигурацию для ротации файла /opt/var/log/messages (таким же образом можно будет настроить ротирование и других логов, если они у вас имеются - например, от прокси). Для этого в подключаемом по-умолчанию каталоге /opt/etc/logrotate.d (указано в основной конфигурации /opt/etc/logrotate.conf) создаем конф-файл messages и добавляем в него следующие строки:

Скрытый текст

/opt/var/log/messages
{
    maxsize 1M
    rotate 3
    sharedscripts
    postrotate
                /opt/etc/init.d/S01syslog-ng reconfigure
    endscript
}

 

Здесь ротация производится по достижению размера лога 1Мб, хранится всего три последних файла. После ротации лога перезапускается сервис syslog-ng (нужно для правильного продолжения записи в новый лог). С учетом основной конфигурации (см. файл /opt/etc/logrotate.conf, опция weekly) ротация лога будет производиться каждую неделю или же при достижении объема 1Мб.

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

Перевод документации по logrotate можно посмотреть на сайте OpenNET.

3. Далее настраиваем cron в основном файле /opt/etc/crontab. Т.к. по-умолчанию задач, выполняемых ежедневно, еженедельно и т.п., у меня нет, то он выглядит так:

Скрытый текст

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/bin:/opt/sbin
MAILTO=""
HOME=/
# ---------- ---------- Default is Empty ---------- ---------- #
#*/1 * * * * root /opt/bin/run-parts /opt/etc/cron.1min
#*/5 * * * * root /opt/bin/run-parts /opt/etc/cron.5mins
#01 * * * * root /opt/bin/run-parts /opt/etc/cron.hourly
02 4 * * * root /opt/bin/run-parts /opt/etc/cron.daily
#22 4 * * 0 root /opt/bin/run-parts /opt/etc/cron.weekly
#42 4 1 * * root /opt/bin/run-parts /opt/etc/cron.monthly

 

Раскоментарена только строка для выполнения ежедневных задач. По-умолчанию после установки cron запускаются все задачи (все строки раскоментарены). Т.е. можно данный файл и не изменять, но при этом в /opt/var/log/messages при выполнении этих задач-заглушек (с частотой, как минимум 1 минута) будет появляться соответствующая запись о выполнении данной задачи. Поэтому решать вам.

Нужно также перезапустить службу cron. Для этого необходимо выполнить команду с консоли:

/opt/etc/init.d/S10cron restart

4. Добавляем в cron задачу, которая будет выполняться один раз в сутки. Для этого в каталоге /opt/etc/cron.daily размещаем исполняемый файл. Я его назвал /opt/etc/cron.daily/logrotate . В нем размещены следующие команды:

Скрытый текст

#!/opt/bin/sh

/opt/sbin/logrotate /opt/etc/logrotate.conf

 

Исполняемым файл можно сделать через пакет mc (файловый менджер - must have) или с командной строки:

chmod 755 /opt/etc/cron.daily/logrotate

Можно проверять необходимость ротации логов чаще, а не только раз в сутки. Для этого нужно раскоментировать соответствующие записи /opt/etc/crontab и поместить задачу logrotate в соответствующий каталог.

Но, как правило, в нашем случае логи быстро не увеличивают размер и в этом необходимости нет.

Обращаю внимание, что linux очень часто плохо относится к тому, если в текстовых конф-файлах и т.п. последняя строка не заканчивается символом возврата каретки. Поэтому необходимо после последней строки в файле нажимать Enter для перевода курсора на новую пустую строку. В приведенных мной примерах эта пустая строка имеется.

Всё.

Если хочется сразу проверить ротацию лога вручную (и его размер в соответствии с конфом уже больше 1Мб), то команду ротации можно принудительно выполнить с консоли (или просто запустить исполняемый файл-задачу):

/opt/sbin/logrotate /opt/etc/logrotate.conf
или (т.к. файл у нас уже исполняемый) запустить задачу
/opt/etc/cron.daily/logrotate
  • Thanks 1

Share this post


Link to post
Share on other sites

А почему просто в имени файла не использовать дату? Или номер недели+год, месяц+год.... на выбор по желаемому объёму? Старые файлы кроном раз в день чистить по маске.

Share this post


Link to post
Share on other sites
10 минут назад, makc22 сказал:

А почему просто в имени файла не использовать дату? Или номер недели+год, месяц+год.... на выбор по желаемому объёму? Старые файлы кроном раз в день чистить по маске.

Не совсем понял о чем вопрос. logrotate как раз и предназначен для того, чтобы не изобретать велосипед и иметь возможность достаточно гибко настроить ротацию логов (особенно если их несколько). Он сам и удаляет старые файлы.

Архивные файлы в зависимости от настроек могут как раз и содержать в имени файла дату ротации (по-умолчанию как раз так и есть). Для указанного примера, это будет выглядеть так:

n                        Name                         │ Size  │Modify time 
..                                                    │UP--DIR│июл 16 23:38
messages                                              │   5075│окт 10 12:21
messages-20160926                                     │ 247934│сен 26 04:02
messages-20161002                                     │ 187521│окт  2 04:02
messages-20161010                                     │ 451485│окт 10 04:02

 

  • Thanks 1

Share this post


Link to post
Share on other sites

Если почитать документацию на syslog-ng (для Кинетиков, кстати, собрана далеко не последняя версия, нет многих возможностей),

то в документации для ротации логов рекомендованы два способа:

1) внешний костыль logrotate и

2) штатное средство в виде имен файлов с датой: destination messages_dst {  file("/opt/log/${YEAR}_${MONTH}_${DAY}.log");  };
 

При этом, оба эти способа имеют нюансы:

1) в той же документации написано, что на время работы внешнего logrotate желательно syslog-ng останавливать, и

2) как будут отрабатываться имена файлов с датой при перезагрузке устройства - непонятно, так как при перезагрузке дата сбивается, и остается неправильной до обновления даты через NTP.

Правильным решением ротации логов было бы собрать и использовать вместо пакета sysslog-ng логгер nxlog, в котором ротация предусмотрена штатно и без костылей, но я не умею собирать пакеты.

Log files can be rotated by size or time without the need of external log rotation tools. Log rotation can also be scheduled in order to guarantee timely file rotation.

The file input reader module supports external log-rotation scripts, it can detect when an input file was moved/renamed and will reopen its input. Similarly, the file output writer module can also monitor when the file being written to is rotated and will reopen its original output. This way it is possible to keep using external log rotation tools without the need to migrate to the built-in log rotation.

Для себя пока остановился на дате в имени файлов, и на чистке барахла cron-ом: 00 6 * * * root find /opt/log/*.log* -daystart -mtime +14 -type f -exec rm {} \;

  • Thanks 2

Share this post


Link to post
Share on other sites
3 часа назад, HuduGuru сказал:

Если почитать документацию на syslog-ng (для Кинетиков, кстати, собрана далеко не последняя версия, нет многих возможностей),

то в документации для ротации логов рекомендованы два способа:

1) внешний костыль logrotate

Ну вообще-то называть logrotate костылем, я бы не стал. Как правило, в linux он является штатным средством для ротации, архивирования, удаления логов. Его преимущество заключается в гибкости настроек и универсальности.

Возможно, ng-syslog и может самостоятельно сохранять логи в требуемом формате, но удалять-то их все-равно придется через cron. А если требуется старые логи сжимать, то тут вообще, скорее всего, без вариантов.

Но выбор средства борьбы с логами, конечно, остается за пользователем.

Но я не зря в начале темы указал, что таким образом можно управлять логами не только от syslog. Есть и другие сервисы и службы (например, почтовые-сервера, прокси, tor и т.д.- благо entware нам позволяет это делать!), которые могут сохранять свои логи, причем в разных каталогах и с различным наименованием. В этом случае logrotate сможет легко с ними управляться.

3 часа назад, HuduGuru сказал:

в той же документации написано, что на время работы внешнего logrotate желательно syslog-ng останавливать

В моем примере это учтено. logrotate переименовывает текущий файл, но ng-syslog продолжает писать в старый файл. По завершению ротации ng-syslog перезапускается для того, чтобы начать писать лог в файл по-умолчанию.

Но если захотеть, то можно в конфе logrotate сначала останавливать ng-syslog, а потом после ротации запускать. Возможность для этого имеется, но я не вижу в этом необходимости, т.к. данного механизма достаточно.

4 часа назад, HuduGuru сказал:

как будут отрабатываться имена файлов с датой при перезагрузке устройства - непонятно, так как при перезагрузке дата сбивается, и остается неправильной до обновления даты через NTP.

Да, тут могут быть, наверное, проблемы. Но это не вина ng-syslog или logrotate. Поэтому для себя и не вижу смысла писать логи ng-syslog в формате ${YEAR}_${MONTH}_${DAY}.log, а ротацию логов по нужному мне формату раз в сутки доверить logrotate.

Share this post


Link to post
Share on other sites

А можно как

В 11.10.2016 в 20:44, gvan сказал:

причем в разных каталогах и с различным наименованием. В этом случае logrotate сможет легко с ними управляться.

А можно как-то эти логи(от разных так скажем сервисов) складывать в одну папку?

Share this post


Link to post
Share on other sites
14 часа назад, Илларион сказал:

А можно как-то эти логи(от разных так скажем сервисов) складывать в одну папку?

1. Проводить ротацию логов можно в разных каталогах. Делайте, например, отдельный конф-файл для этого.

2. В соответствии с документацией, существует опция olddir

Цитата

Переместить сдвинутые журналы в каталог. Заданный каталог должен размещаться на том же физическом устройстве, что и обращаемый файл журнала. При использовании этого параметра все старые версии журнала будут попадать в каталог. Этот параметр может быть переопределён параметром noolddir.

Это требуется?

Документацию можно посмотреть в интернете. Например, есть перевод мануала на сайте OpenNET.

Edited by gvan
  • Thanks 1

Share this post


Link to post
Share on other sites
~ # chmod 755 /opt/etc/cron.daily/logrotate
~ # /opt/sbin/logrotate /opt/etc/logrotate.conf
error: Ignoring messages because of bad file mode - must be 0644 or 0444.
~ #


Почему???

Share this post


Link to post
Share on other sites
19 часов назад, Oleg Shabanov сказал:

error: Ignoring messages because of bad file mode - must be 0644 or 0444.

Файловая система на диске с entware какая? Что показывает команда:

$ ls -l /opt/etc/logrotate.conf
-rw-------    1 root     root           893 Dec 24 17:46 /opt/etc/logrotate.conf

Должно быть так, как в пример выше - только чтение/запись для root. Но если файловая система ntfs, то корректно права на нужные изменить не удастся.

Share this post


Link to post
Share on other sites
On 1/28/2017 at 1:30 PM, gvan said:

Файловая система на диске с entware какая? Что показывает команда:


$ ls -l /opt/etc/logrotate.conf
-rw-------    1 root     root           893 Dec 24 17:46 /opt/etc/logrotate.conf

Должно быть так, как в пример выше - только чтение/запись для root. Но если файловая система ntfs, то корректно права на нужные изменить не удастся.

~ # ls -l /opt/etc/logrotate.conf
-rw-------    1 root     root           893 Dec 25 23:57 /opt/etc/logrotate.conf
~ #

 

Share this post


Link to post
Share on other sites
22 часа назад, Oleg Shabanov сказал:

~ # ls -l /opt/etc/logrotate.conf

Тогда нужно еще:

$ ls -l /opt/etc/logrotate.d/
-rw-r--r--    1 root     root           158 Oct 10 09:19 messages

Я думаю, что на файле /opt/etc/logrotate.d/messages у вас стоят права rwrwrw. Попробовал у себя поменять на такие - тоже появилась подобная ошибка.

Share this post


Link to post
Share on other sites
On 06.02.2017 at 11:45 AM, gvan said:

Тогда нужно еще:


$ ls -l /opt/etc/logrotate.d/
-rw-r--r--    1 root     root           158 Oct 10 09:19 messages

Я думаю, что на файле /opt/etc/logrotate.d/messages у вас стоят права rwrwrw. Попробовал у себя поменять на такие - тоже появилась подобная ошибка.

BusyBox v1.25.1 () built-in shell (ash)

~ # ls -l /opt/etc/logrotate.d/
-rwxrw-rw-    1 root     root           176 Jan 27 17:21 messages

 

Share this post


Link to post
Share on other sites
1 минуту назад, Oleg Shabanov сказал:

-rwxrw-rw-    1 root     root           176 Jan 27 17:21 messages

Ну вот. Нужно поменять на -rwrr--r--

chmod 644 messages

 

Share this post


Link to post
Share on other sites
В 10.10.2016 в 12:26, gvan сказал:

и я хочу, чтобы он "засыпал" и отключал питание, то все логи пишу на

Тоже решил перейти на флешку, как у Вас реализовано отключение диска? Раньше вроде было в настройках веб интерфейса а сейчас что то найти не могу.

Share this post


Link to post
Share on other sites
18 часов назад, Илларион сказал:

Тоже решил перейти на флешку, как у Вас реализовано отключение диска? Раньше вроде было в настройках веб интерфейса а сейчас что то найти не могу.

Где-то на форуме от разработчиков проскакивала информация, что в последних версиях прошивки логическое засыпание винта отключили. В веб-интерфейсе это вообще давно убрали.

У меня винт засыпает, скорее всего, из-за того, что сам контроллер (или прослойка между USB-SATA) решает отключить HDD. Т.е. через SMART и hddparm у меня принудительно отключать питание не удалось - винт все равно засыпает.

Но это не тема для обсуждения данной проблемы здесь...

  • Thanks 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...