Jump to content

Ротация логов в 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 2
Link to comment
Share on other sites

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

Link to comment
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
Link to comment
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
Link to comment
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.

Link to comment
Share on other sites

  • 3 weeks later...

А можно как

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

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

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

Link to comment
Share on other sites

14 часа назад, Илларион сказал:

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

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

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

Цитата

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

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

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

Edited by gvan
  • Thanks 1
Link to comment
Share on other sites

  • 2 months later...
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, то корректно права на нужные изменить не удастся.

Link to comment
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
~ #

 

Link to comment
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. Попробовал у себя поменять на такие - тоже появилась подобная ошибка.

Link to comment
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

 

Link to comment
Share on other sites

1 минуту назад, Oleg Shabanov сказал:

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

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

chmod 644 messages

 

Link to comment
Share on other sites

  • 1 month later...
В 10.10.2016 в 12:26, gvan сказал:

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

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

Link to comment
Share on other sites

18 часов назад, Илларион сказал:

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

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

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

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

  • Thanks 1
Link to comment
Share on other sites

  • 2 years later...

Добрый день.

У меня что-то явно пошло не так.

Скажите, по какому пути должны файлы логов появляться?

У меня в var/log файл messages обновляться перестал. Но я нигде не вижу новых файлов - как результата этой инструкции.

Или я что-то не так сделал. Прошу помощи.

Spoiler

logrotate.png

 

Edited by Алексей Саратовский
Link to comment
Share on other sites

4 минуты назад, Алексей Саратовский сказал:

Скажите, по какому пути должны файлы логов появляться?

Логи в entware лежат по пути /opt/var/log.

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

Link to comment
Share on other sites

то есть должно одновременно всё быть: и обновление messages и ротация в той же папке, верно?

И скажите, пожалуйста, именно по вашей теме - я всё верно сделал (скрин выше)?

Link to comment
Share on other sites

27 минут назад, Алексей Саратовский сказал:

то есть должно одновременно всё быть: и обновление messages и ротация в той же папке, верно?

И скажите, пожалуйста, именно по вашей теме - я всё верно сделал (скрин выше)?

Ротация никакого отношения к обновлению логов не имеет. Ее задача правильно перенести/архивировать файлы журналов.

На скрине выше вообще непонятно, что вы там настроили. 

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

Сначала разберитесь с обновлением логов и добейтесь того, чтобы данные в них писались. Удалите пакет logrotate и скрипт /opt/etc/cron.daily/logrotate, перезапустите роутер, проверьте данные.

Link to comment
Share on other sites

  • 1 year later...

сделал файл logs.conf и положил в etc/logrotate.d

/opt/var/log/nginx/*.log
{
	rotate 4
	size 2k
	compress
	compresscmd /opt/bin/gzip
	uncompresscmd /opt/bin/gunzip
	compressext .gz
	copytruncate
	missingok
	olddir /opt/var/log/nginx/old
	dateext
}

другой test.sh в cron etc/cron.hourly

#!/bin/sh
cd /opt/sbin
logrotate -s /opt/var/lib/logrotate.status /opt/etc/logrotate.conf

по задумке хотелось чтоб cron давал команду logrotate раз в час вертеть логи при достижении размера и паковать. где я делаю ошибку?

Link to comment
Share on other sites

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



~ # cd /opt/sbin
/opt/sbin # logrotate -s /opt/var/lib/logrotate.status -d /opt/etc/logrotate.conf
WARNING: logrotate in debug mode does nothing except printing debug messages!  Consider using verbose mode (-v) instead if this is not what you want.

reading config file /opt/etc/logrotate.conf
including /opt/etc/logrotate.d
reading config file logs.conf
compress_prog is now /opt/bin/gzip
compress_ext was changed to .gz
uncompress_prog is now /opt/bin/gunzip
compress_ext is now .gz
olddir is now /opt/var/log/nginx/old
Reading state from file: /opt/var/lib/logrotate.status
Allocating hash table for state file, size 64 entries

Handling 1 logs

rotating pattern: /opt/var/log/nginx/*.log
 2048 bytes (4 rotations)
olddir is /opt/var/log/nginx/old, empty log files are rotated, old logs are removed
considering log /opt/var/log/nginx/access.log
Creating new state
  Now: 2021-03-18 18:51
  Last rotated at 2021-03-18 18:00
  log needs rotating
considering log /opt/var/log/nginx/error.log
Creating new state
  Now: 2021-03-18 18:51
  Last rotated at 2021-03-18 18:00
  log needs rotating
rotating log /opt/var/log/nginx/access.log, log->rotateCount is 4
dateext suffix '-20210318'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
copying /opt/var/log/nginx/access.log to /opt/var/log/nginx/old/access.log-20210318
truncating /opt/var/log/nginx/access.log
compressing log with: /opt/bin/gzip
rotating log /opt/var/log/nginx/error.log, log->rotateCount is 4
dateext suffix '-20210318'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
copying /opt/var/log/nginx/error.log to /opt/var/log/nginx/old/error.log-20210318
truncating /opt/var/log/nginx/error.log
compressing log with: /opt/bin/gzip

 

при отладке вроде без ошибок.

Edited by Meccep45
Link to comment
Share on other sites

16 часов назад, Meccep45 сказал:

при отладке вроде без ошибок

Т.е.при ручном запуске/отладке вертит правильно (при достижении нужных критериев), но по крону не отрабатывает? Могу предположить, что нужно в основном файле crontab убрать комментарий для разрешения запуска почасовых задач (в первом сообщении темы об этом есть информация). А скрипт /opt/etc/cron.daily/logrotate просто также скопировать в cron.hourly (test.sh по сути не нужен).

Edited by gvan
Link to comment
Share on other sites

  • 5 months later...

I did syslog (to external disk) successfully via @Roman_Petrov guide. Thanks to him.  image.png.d0ab48f19a193dff52f366e19ab1c9ab.png

But I can not rotate these logs.

Test action give me this error: image.png.96f50c346c7132ea8ece4cea6e894890.png

 

My Opkg Disk : Ext4

My External Disk : Ext2

logrotate.conf is permission 775

 

My syslogs file in /opt/etc/logrotate.d/

 

/tmp/mnt/b8ba1277-55a4-d701-90b8-127755a4d701/syslogs
{
    maxsize 1M
    rotate 3
    sharedscripts
    postrotate
                /opt/etc/init.d/S01syslog-ng reconfigure
    endscript
}

 

 

I miss something which I can not see. :( 

Edited by yerebakan
Link to comment
Share on other sites

  • 3 months later...
14 часа назад, ale_xb сказал:

Хочу понять, зачем ставить cron из entaware? Разве crond из состава прошивки/busybox не достаточно для этого?

В первом сообщение есть примечание по cron (на момент написания сообщения). Если все устраивает и работает (задачи из crontab выполняются) с существующим cron, то необходимости в установке нет.

Link to comment
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...