gvan Posted October 10, 2016 Share Posted October 10, 2016 Если вы задались задачей собирать логи (журналы работы) системы в отдельный файл, который не стирается после перезагрузки роутера, то, скорее всего, через некоторое время столкнетесь с проблемой, когда размер лога станет занимать значительный объем диска. Задача по включении системного логирования во внешний лог описывается в соответствующей теме "Запись 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 2 Quote Link to comment Share on other sites More sharing options...
makc22 Posted October 10, 2016 Share Posted October 10, 2016 А почему просто в имени файла не использовать дату? Или номер недели+год, месяц+год.... на выбор по желаемому объёму? Старые файлы кроном раз в день чистить по маске. Quote Link to comment Share on other sites More sharing options...
gvan Posted October 10, 2016 Author Share Posted October 10, 2016 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 1 Quote Link to comment Share on other sites More sharing options...
HuduGuru Posted October 11, 2016 Share Posted October 11, 2016 Если почитать документацию на 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 {} \; 2 Quote Link to comment Share on other sites More sharing options...
gvan Posted October 11, 2016 Author Share Posted October 11, 2016 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. Quote Link to comment Share on other sites More sharing options...
Илларион Posted October 27, 2016 Share Posted October 27, 2016 А можно как В 11.10.2016 в 20:44, gvan сказал: причем в разных каталогах и с различным наименованием. В этом случае logrotate сможет легко с ними управляться. А можно как-то эти логи(от разных так скажем сервисов) складывать в одну папку? Quote Link to comment Share on other sites More sharing options...
gvan Posted October 28, 2016 Author Share Posted October 28, 2016 (edited) 14 часа назад, Илларион сказал: А можно как-то эти логи(от разных так скажем сервисов) складывать в одну папку? 1. Проводить ротацию логов можно в разных каталогах. Делайте, например, отдельный конф-файл для этого. 2. В соответствии с документацией, существует опция olddir Цитата Переместить сдвинутые журналы в каталог. Заданный каталог должен размещаться на том же физическом устройстве, что и обращаемый файл журнала. При использовании этого параметра все старые версии журнала будут попадать в каталог. Этот параметр может быть переопределён параметром noolddir. Это требуется? Документацию можно посмотреть в интернете. Например, есть перевод мануала на сайте OpenNET. Edited October 28, 2016 by gvan 1 Quote Link to comment Share on other sites More sharing options...
Shabos Posted January 27, 2017 Share Posted January 27, 2017 ~ # 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. ~ # Почему??? Quote Link to comment Share on other sites More sharing options...
gvan Posted January 28, 2017 Author Share Posted January 28, 2017 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, то корректно права на нужные изменить не удастся. Quote Link to comment Share on other sites More sharing options...
Shabos Posted February 5, 2017 Share Posted February 5, 2017 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 ~ # Quote Link to comment Share on other sites More sharing options...
gvan Posted February 6, 2017 Author Share Posted February 6, 2017 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. Попробовал у себя поменять на такие - тоже появилась подобная ошибка. Quote Link to comment Share on other sites More sharing options...
Shabos Posted February 13, 2017 Share Posted February 13, 2017 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 Quote Link to comment Share on other sites More sharing options...
gvan Posted February 13, 2017 Author Share Posted February 13, 2017 1 минуту назад, Oleg Shabanov сказал: -rwxrw-rw- 1 root root 176 Jan 27 17:21 messages Ну вот. Нужно поменять на -rwrr--r-- chmod 644 messages Quote Link to comment Share on other sites More sharing options...
Илларион Posted March 13, 2017 Share Posted March 13, 2017 В 10.10.2016 в 12:26, gvan сказал: и я хочу, чтобы он "засыпал" и отключал питание, то все логи пишу на Тоже решил перейти на флешку, как у Вас реализовано отключение диска? Раньше вроде было в настройках веб интерфейса а сейчас что то найти не могу. Quote Link to comment Share on other sites More sharing options...
gvan Posted March 14, 2017 Author Share Posted March 14, 2017 18 часов назад, Илларион сказал: Тоже решил перейти на флешку, как у Вас реализовано отключение диска? Раньше вроде было в настройках веб интерфейса а сейчас что то найти не могу. Где-то на форуме от разработчиков проскакивала информация, что в последних версиях прошивки логическое засыпание винта отключили. В веб-интерфейсе это вообще давно убрали. У меня винт засыпает, скорее всего, из-за того, что сам контроллер (или прослойка между USB-SATA) решает отключить HDD. Т.е. через SMART и hddparm у меня принудительно отключать питание не удалось - винт все равно засыпает. Но это не тема для обсуждения данной проблемы здесь... 1 Quote Link to comment Share on other sites More sharing options...
Алексей Саратовский Posted September 9, 2019 Share Posted September 9, 2019 (edited) Добрый день. У меня что-то явно пошло не так. Скажите, по какому пути должны файлы логов появляться? У меня в var/log файл messages обновляться перестал. Но я нигде не вижу новых файлов - как результата этой инструкции. Или я что-то не так сделал. Прошу помощи. Spoiler Edited September 9, 2019 by Алексей Саратовский Quote Link to comment Share on other sites More sharing options...
gvan Posted September 9, 2019 Author Share Posted September 9, 2019 4 минуты назад, Алексей Саратовский сказал: Скажите, по какому пути должны файлы логов появляться? Логи в entware лежат по пути /opt/var/log. Файл messages тоже находится там. Если он перестал обновляться, то настройка ротации логов вряд ли виновата. Для проверки можно сделать рестарт службы syslog-ng и посмотреть, станут ли в него добавляться новые данные. Если нет, то вопрос следует задать в соответствующей теме (ссылка есть в первом сообщении). Quote Link to comment Share on other sites More sharing options...
Алексей Саратовский Posted September 9, 2019 Share Posted September 9, 2019 то есть должно одновременно всё быть: и обновление messages и ротация в той же папке, верно? И скажите, пожалуйста, именно по вашей теме - я всё верно сделал (скрин выше)? Quote Link to comment Share on other sites More sharing options...
gvan Posted September 9, 2019 Author Share Posted September 9, 2019 27 минут назад, Алексей Саратовский сказал: то есть должно одновременно всё быть: и обновление messages и ротация в той же папке, верно? И скажите, пожалуйста, именно по вашей теме - я всё верно сделал (скрин выше)? Ротация никакого отношения к обновлению логов не имеет. Ее задача правильно перенести/архивировать файлы журналов. На скрине выше вообще непонятно, что вы там настроили. Повторюсь. Если у вас перестали обновляться логи, что ротация здесь не причем (за исключением уж совсем клинических случаев). Сначала разберитесь с обновлением логов и добейтесь того, чтобы данные в них писались. Удалите пакет logrotate и скрипт /opt/etc/cron.daily/logrotate, перезапустите роутер, проверьте данные. Quote Link to comment Share on other sites More sharing options...
Meccep45 Posted March 18, 2021 Share Posted March 18, 2021 сделал файл 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 раз в час вертеть логи при достижении размера и паковать. где я делаю ошибку? Quote Link to comment Share on other sites More sharing options...
Meccep45 Posted March 18, 2021 Share Posted March 18, 2021 (edited) Скрытый текст ~ # 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 March 18, 2021 by Meccep45 Quote Link to comment Share on other sites More sharing options...
gvan Posted March 19, 2021 Author Share Posted March 19, 2021 (edited) 16 часов назад, Meccep45 сказал: при отладке вроде без ошибок Т.е.при ручном запуске/отладке вертит правильно (при достижении нужных критериев), но по крону не отрабатывает? Могу предположить, что нужно в основном файле crontab убрать комментарий для разрешения запуска почасовых задач (в первом сообщении темы об этом есть информация). А скрипт /opt/etc/cron.daily/logrotate просто также скопировать в cron.hourly (test.sh по сути не нужен). Edited March 19, 2021 by gvan Quote Link to comment Share on other sites More sharing options...
KYTECHNGAMING Posted September 9, 2021 Share Posted September 9, 2021 (edited) I did syslog (to external disk) successfully via @Roman_Petrov guide. Thanks to him. But I can not rotate these logs. Test action give me this error: 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 September 9, 2021 by yerebakan Quote Link to comment Share on other sites More sharing options...
laforsh Posted September 9, 2021 Share Posted September 9, 2021 Set /opt/etc/logrotate.conf permission 644 and owner root:root Quote Link to comment Share on other sites More sharing options...
ale_xb Posted December 19, 2021 Share Posted December 19, 2021 Хочу понять, зачем ставить cron из entaware? Разве crond из состава прошивки/busybox не достаточно для этого? Quote Link to comment Share on other sites More sharing options...
gvan Posted December 20, 2021 Author Share Posted December 20, 2021 14 часа назад, ale_xb сказал: Хочу понять, зачем ставить cron из entaware? Разве crond из состава прошивки/busybox не достаточно для этого? В первом сообщение есть примечание по cron (на момент написания сообщения). Если все устраивает и работает (задачи из crontab выполняются) с существующим cron, то необходимости в установке нет. Quote Link to comment Share on other sites More sharing options...
vitslayer Posted June 14 Share Posted June 14 При ротацмм логов на отдельный раздел флешки стало выдавать ошибку /tmp/mnt/BackUp/log/messages" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation. не получается исправить. какие права он хочет на эти папки? подскажите пжлста. Quote Link to comment Share on other sites More sharing options...
vitslayer Posted June 14 Share Posted June 14 1 час назад, vitslayer сказал: При ротацмм логов на отдельный раздел флешки стало выдавать ошибку /tmp/mnt/BackUp/log/messages" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation. не получается исправить. какие права он хочет на эти папки? подскажите пжлста. Решил проблему путем добавления su root root в opt/etc/logrotate.d/messages Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.