Logrotate: налаштування ротації логів. Опції, пов'язані з розміром та існуванням логового файлу. Опції, пов'язані з розсилкою логів

logrotate - це програма ротації логів, що дозволяє зберігати в окремий файллогі за певний періодчасу або розділити балку на частини певного розміру. Logrotate дозволяє дуже гнучко працювати з логами, маючи при цьому прості та зрозумілі конфігураційні файли. Крім цього, логи можна автоматично стискати та інформувати поштою про ротацію з відсиланням свіжого лога, або останнього, яке видалено при останній ротації. У Наразі logrotate є найпоширенішою системою ротації логів, оскільки широко використовується в операційні системина базі ядра linux, які домінують у сфері серверів у всьому світі.

Конфігурація logrotate

Конфігурація logrotate розділена на частини. Основна частина зазвичай зберігається у файлі /etc/logrotate.conf. У цьому файлі можуть бути секції для ротації логів, а також директива "include /etc/logrotate.d", що включає конфігураційні файли з директорії /etc/logrotate.d. Таким чином, для створення нового завдання ротації вам достатньо створити файл конфігурації і помістити його в цю директорію. Назва файлу бажано задавати таку ж, як і назва сервісу, логи якого ротуватимуться.

Ось приклад файлу конфігурації /etc/logrotate.conf:

# rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # uncomment this if you want your log files compressed #compress # /etc/logrotate.d # no packages own wtmp, або btmp - we'll rotate them here /var/log/wtmp utmp rotate 1 )

Як ви розумієте, ротуватися можуть не лише файли логів, а й будь-які інші файли. Наприклад, можна таким чином робити щоденні резервні копіїякогось певного файлу. Але ротація ліг — це саме те основне завдання, яке спочатку вирішує програма, і вирішує добре.

Кожен файл директорії /etc/logrotate.d може включати одну або кілька секцій. Кожна секція виглядає в загальному виглядітак:

Назва-файла-лога (параметри ротації)

Параметри ротації - це те, що забезпечує гнучкість ротації. У logrotate досить багато опцій, але їх можна розбити на кілька груп. Ось опції, які можна використовувати в конфігураційних файлах:

Опції, що визначають інтервал ротації:

Опції стиснення логів:

compress Стискати логи при ротації. За промовчанням для стиснення використовується gzip
compresscmd Команда/програма, яка використовуватиметься для стиснення логів
compressoptions Опції команди ротації, які будуть використовуватись при стисканні логів
uncompresscmd Команда розархівації логів. Типово gunzip
compressext Вказати розширення файлів, яке вказуватиметься для стиснених логів
delaycompress Відкласти стиск лога до наступної ротації. Таким чином остання версіялога після ротації буде стиснутою, а більш ранні — стиснутими
nocompress Не стискати логи під час ротації
nodelaycompress Не відкладати стиск до наступної ітерації ротації. Ця опція перевантажує опцію delaycompress

Опції копіювання:

copy Копіювати файл, але не змінювати оригінал. Цю опцію можна використовувати, коли треба створити знімок лога на певний моментзамість ротації, або коли для усічення лога використовується зовнішня програма. Якщо використовується опція copy, то опція create, якщо вона вказана, не матиме жодного ефекту, оскільки старий логзалишається.
copytruncate Урізати оригінальний файл до нульового розмірупісля створення копії замість перейменування оригінального файлу та створення нового. Ця опція використовується тоді, коли програмі, що записує лог, не можна вказати, що потрібно закрити пов'язаний із файлом лога дескриптор та відкрити новий. Така програма може продовжувати писати в старий файл. При використанні цієї опції є один момент, пов'язаний з тим, що на копіювання потрібно деякий час і тому файл не може бути скопійований миттєво. За час копіювання в балку можуть бути додані записи, які будуть втрачені при усіченні файлу до нульового розміру. При використанні цієї опції опція create також не матиме ефекту, оскільки старий файл залишається на місці
nocopy Не копіюйте оригінальний лог-файл. Ця опція перевантажує опцію copy
nocopytruncate Не усікати оригінальний лог-файл після створення копії. Ця опція перевантажує опцію copytruncate

Опції створення нового лог-файлу (після ротації старого):

create права власник група
create власник група
Вказати права доступу, власника та групу володіння нового свіжостворюваного лог-файлу відразу після його створення. Як згадувалося, якщо використовуються опції copy і copytruncate, то create немає сенсу, оскільки старий файл залишається дома, новий файлне створюється. Щоб опція create відпрацювала, файл має бути відсутнім. Права вказуються вісімковими значеннями у такому вигляді, як і з використанням програми chmod. Наприклад, 644 або 600. Якщо якесь значення (права/власник/група) опущене, воно буде таким самим, як у оригінального файлу
nocreate Нові лог-файли не створюються. Ця опція перевантажує опцію create

Опції, пов'язані з видаленням файлу лога:

Опції, пов'язані з датами:

dateext Використовуйте в назві старих лог-файлів дату замість номера. При використанні номера назви виглядають так: logfile.1.gz, logfile.2.gz і таке інше
nodateext Не використовувати дату в назвах старих файлів. Ця опція перевантажує опцію dateext
dateformat форматний-рядок Вказати форматний рядок для дати, яка додаватиметься до назви лога. Форматний рядок схожий на date, що використовується в команді, але допустимі тільки шаблони %Y(чотиризначний номер року), %m(двозначний номер місяця), %d(двозначний номер дня місяця) і %s(unix time, кількість секунд з 00:00 01.01.1970). Значення за промовчанням "-%Y%m%d", мінус також включений в шаблон, при заданні шаблону його можна упустити. Слід зазначити, що logrotate використовує сортування для визначення старіших файлів, які потрібно видалити, тому рядок дати повинен враховувати коректне сортування. Саме тому спочатку пишеться зазвичай рік, потім місяць і лише потім день.
dateyesterday Використовувати вчорашню дату під час ротації. Таким чином, дата в назві файлу буде відповідати даті файлу, що знаходиться всередині архіву

Опції, пов'язані з розсилкою логів:

Опції, пов'язані з розміром та існуванням файлу лога:

maxsize розмір Лог ротується, коли його розмір перевищить зазначений, ще до наступного інтервалу ротації (daily, weekly, monthly, yearly). Оскільки така ротація не залежить від часу, то використовувати в назві файлу дату не має сенсу.
minsize розмір Лог ротується, коли його розмір більший за вказаний, але не раніше, ніж настає відповідний часовий інтервал ротації (daily, weekly, monthly, yearly)
size розмір Лог ротується, коли його розмір більший за вказану кількість байт. Якщо після розміру вказано букву k, розмір вважається в кілобайтах, якщо M — мегабайтах, якщо G — гігабайтах. Наприклад, 1G чи 10M.
ifempty Ротувати файл лога, навіть якщо він порожній. Використовується за промовчанням.
notifempty Не ротуйте файл лога, якщо він порожній. Перевантажує опцію ifempty.
missingok Якщо файл лога відсутній, перейдіть до наступного без повідомлення про помилку
nomissingok Якщо файл лога відсутній, виникне помилка. Цей параметр встановлено за замовчуванням.

Опції, пов'язані з директоріями, у яких зберігаються логи:

Файли налаштувань для logrotate дозволяють виконувати скрипти у процесі ротації логів. Таким чином, можна виконати якісь дії на кожному етапі ротації.

Опції виконання скриптів:

postrotate/endscript Рядки, що знаходяться між словами postrotate та endscript, кожне з яких має знаходитися в окремому рядку, виконуються з використанням /bin/sh після ротації файлу лога. Зазвичай скрипту як перший аргумент передається повне ім'яфайл лога за допомогою. Якщо вказана директива sharedscripts, то передається список файлів. Таким чином можна виконати скрипт для всіх файлів відразу
prerotate/endscript Рядки, що знаходяться між словами prerotate та endscript, кожне з яких має знаходитися в окремому рядку, виконуються за допомогою /bin/sh перед ротацією файлу лога. Зазвичай скрипт як перший аргумент передається повне ім'я файлу лога з шляхом. Якщо вказана директива sharedscripts, то передається список файлів.
sharedscripts У звичайному режиміскрипти виконуються один раз на кожен файл, вказаний для ротації. Таким чином, скрипти можуть бути виконані кілька разів, по разу для кожного файлу, вказаного для ротації. Якщо вказана директива sharedscripts, то скрипти виконуються по одному разу, але як аргументи їм передається список файлів. Якщо ж жоден файл лога не ротується, скрипти не виконані. Якщо у процесі виконання скрипта виникне помилка, то дія буде завершено всім логів.
nosharedscripts Запустити prerotate та postrotate скрипти для кожного лога, який ротується. Це значення за замовчуванням, крім того, ця директива перевантажує sharedscripts. Скриптам передається абсолютний шляхфайлів логів. Якщо під час виконання скрипту виникне помилка, то дія не буде завершена лише для одного поточного файлулогу.
preremove/endscript Рядки, що знаходяться між словами preremove та endscript, кожне з яких має знаходитися в окремому рядку, виконуються з використанням /bin/sh перед видаленням старого логового файлу. logrotate передасть назву файлу, який буде видалено, скрипту як аргумент
firstaction/endscript Рядки, що знаходяться між словами firstaction і endscript, кожне з яких має знаходитись в окремому рядку, виконуються з використанням /bin/sh один раз до того, як лог-файли будуть ротовані та ще до того, як буде виконана секція prerotate. Це станеться лише в тому випадку, якщо хоча б один лог-файл дійсно ротуватиметься. Скрипту передається весь список файлів поточної секції як аргументи. Якщо скрипт закінчує роботу з помилкою, іншого запуску не буде.
lastaction/endscript Рядки, що знаходяться між словами lastaction і endscript, кожне з яких повинно знаходитися в окремому рядку, виконуються з використанням /bin/sh один раз тільки після того, як лог-файли будуть ротовані і навіть після того, як буде виконано секцію postrotate. Це станеться лише в тому випадку, якщо хоча б один лог-файл ротовано. Скрипту передається весь список файлів поточної секції як аргументи. Якщо скрипт закінчує роботу з помилкою, іншого запуску не буде.

Опції загального призначення:

extention розширення Лог-файли із зазначеним розширенням можуть зберігати його після ротації. Якщо використовується компресія, розширення з типом архіву (зазвичай.gz) з'являється після розширення. Наприклад, якщо у вас файл лога називається mylog.foo і ви хочете одержати при ротації файл mylog.1.foo.gz, а не mylog.foo.1.gz
rotate кількість Лог-файли ротуються вказану кількість разів до видалення або відправки на адресу, вказану в директиві mail. Якщо кількість дорівнює 0, старі версії просто видаляються замість ротації.
start номер Вказати номер, який використовується як база для нумерації при ротації. Наприклад, якщо ви вказуєте 0, то оригінальний файл буде ротуватися у файл із закінченням .0, і далі за збільшенням, якщо вказати 9, то нумерація почнеться с.9. Файли в будь-якому випадку ротуватимуться таку кількість разів, яка вказана в директиві count.
su користувач група Виконувати ротацію логів під вказаним користувачем та групою замість користувача за промовчанням (зазвичай root). Якщо користувачі або групи недостатньо прав для здійснення ротації, виникне помилка.
include файл-або-директорія logrotate зчитує вказаний файлі вставляє його в конфігураційний файл в місце вставки директиви include. Якщо вказано директорію, файли з неї сортуються за абеткою і потім вставляються в конфігурацію. При цьому, якщо файли не є звичайними файлами, вони ігноруються. Це можуть бути, наприклад, іменовані пайпи чи директорії. Також ігноруються файли, що мають розширення, зазначені в директорії tabooext.
tabooext [+] список Зміна поточного списку розширень, що ігноруються. Якщо перед списком стоїть +, поточний список доповнюється вказаним. Якщо + не вказано, список замінюється. За замовчуванням список спочатку включає такі розширення: .rpmsave, .rpmorig, ~, .disabled, .dpkg-old, .dpkg-dist, .dpkg-new, .cfsaved, .ucf-old, .ucf-dist, .ucf- new, .rpmnew, .swp, .cfsaved, .rhn-cfg-tmp-*

І насамкінець простий приклад.

/var/log/mydaemon/mydaemon.log /var/log/mydaemon/error.log( # Щоденна ротація daily # Починати нумерацію з 0 start 0 # Ротувати 30 разів до видалення rotate 30 # Не генерувати помилку, якщо файлу лога немає missingok # Видаляти логи за допомогою команди shred shred # Робити 3 цикли перезапису shredcycles 3 # Відкласти стиск останнього лога delaycompress # Виконувати postrotate тільки один раз sharedscripts # Після ротації надіслати програмі сигнал SIGHUP, в результаті чого # будуть перевідкриті дескриптори поведінка) postrotate kill -SIGHUP $(cat /var/run/mydaemon.pid) endscript )

Якщо ви раніше не користувалися програмою logrotate або користувалися, але ніколи не налаштовували тонко під себе, сподіваюся, ця інформація вам допоможе.

Якось тут днями зіткнувся з проблемою, SAMSвиявляється не відображає статистику за останні 6 місяців. Почавши розбиратися, що з ним сталося, з'ясував, що файл логів squid-а ( access.log) був великого розміру~ 20 Гб. Трохи почитавши і повивчавши з чим це може бути пов'язано, дійшов висновку що для SAMSфайл лога занадто великий і записи з лога не переносяться до бази. Значить треба зробити так, щоб ліг не розростався до таких розмірів, тобто. налаштувати ротацію логів sqiud-А. Ну так приступимо. Для початку я перевірив, чи є в системі logrotate. Виконавши команду whereis logrotateотримав у відповідь /usr/ports/sysutils/logrotate що вказувало на те, що logrotate в системі немає. Значить доведеться встановити. Виконуємо наступну послідовністькоманд:

# cd /usr/ports/sysutils/logrotate/
make
# make install

Після закінчення встановлення logrotateперейдемо до налаштування програми. Файл налаштувань logrotateу папці /usr/local/etc/. Файл налаштувань називається logroate.conf.sample. Перейменуємо файл шляхом копіювання його на файл logrotate.conf:

# cd /usr/local/etc/
# ls
apache php.ini-dist slsh.rc
logrotate.conf.sample php.ini-recommended squid
pam.d rc.d supfile
php sams.conf xml2Conf.sh
php.conf sams.conf.sample xsltConf.sh
php.ini sams.core
# cp logrotate.conf.sample logrotate.conf
#

Приступимо до налаштування. Вид стандартного файлутакий:

# «man logrotate» for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
compress
# RPM packages drop log rotation information in this directory
include /usr/local/etc/logrotate.d
/var/log/lastlog (
monthly
rotate 1
}
# system-specific logs may be configured here

Основний лог squid-А це файл access.logякий знаходиться у папці /usr/local/squid/logs. Відповідно додаємо у файл конфігурації наступні рядки:

/usr/local/squid/logs/access.log ( #— ротацію якого лог файлу виконуватимемо
monthly #- як часто виконувати ротацію лога - раз на місяць
rotate 5 #- скільки попередніх версійзберігати
copytruncate
nocompress
notifempty
missingok
sharedscripts
postrotate #— команда, яку необхідно виконати після ротації

/usr/local/etc/rc.d/squid restart #— сама команда переконфігурування squid-а
endscript
}
Ну ось начебто і все про ротацію ліг.

PS: Ще треба налаштувати запуск logrotateза розкладом, для цього йдемо в папку /etc та редагуємо файл crontab додаючи туди наступний запис:
# Run logrotate every first day of the month
0 0 1 * * root /usr/local/sbin/logrotate -f /usr/local/etc/logrotate.conf

Як показав читацький відгук - ротація логів одна з тем, що викликають певну скруту. Зокрема виникають проблеми з налаштуванням ротації логів проксі сервера squid, що ускладнює отримання звітів за період. Тому ми вирішили внести ясність і розповісти, що таке ротація ліг і як її налаштувати.

Всі події, що заслуговують на увагу, записуються системою у файли журналів або лог-файли, які згодом можна використовувати для аналізу збоїв, отримання статистики, розслідування інцидентів і т.д. і т.п. Необхідність ведення логів, записи події, їх подробиця і повнота зазвичай задаються в конфігурації тієї чи іншої служби і, як правило, мають деякі установки за замовчуванням, які підходять більшості користувачів.

Щоб уникнути безконтрольного зростання таких файлів потрібен механізм, що обмежує число записів деякою розумною межею, це може бути розмір файлу, при перевищенні якого старі записи будуть затиратися, або термін, після якого записи перестануть бути актуальними і можуть бути видалені. У Ubuntu Serverтакий механізм називається ротацією логівта реалізується за допомогою системної служби logrotate.

Як випливає з назви, ротація ліг здійснює періодичну заміну старих ліг новими, поміщаючи застарілі дані в архів або просто видаляючи їх. Залежно від налаштувань архів ліг може зберігатися як у стислому, так і в стислому вигляді і мати необхідну глибину.

Жодних обмежень тут немає, крім здорового глуздута обсягу жорсткого диска, що дозволяє налаштувати цей процес у повній відповідності до ваших потреб. Так, наприклад, ви можете робити щоденну ротацію і зберігати вчорашній лог в несжатому вигляді, а інші у вигляді архівів. При кожній наступній ротації ланцюжок ніби зрушується, останній лог перезаписується передостаннім, а поточний лог очищається (або створюється заново).

Розглянемо налаштування ротації на прикладі логів проксі-сервера squid, яке викликає у наших читачів низку труднощів. Основні налаштування ротації зберігаються в /etc/logrotate.confКрім того, окремі служби можуть мати власні налаштуванняротації, які зберігаються в спеціальних файлаху директорії /etc/logrotate.d, налаштування яких перекривають налаштування logrotate.conf.

Такий підхід дозволяє гнучко налаштувати ротацію для кожної конкретної служби, не торкаючись загальних налаштувань. Сама служба викликається раз на добу через планувальник cron.

Відкриємо файл /etc/logrotate.d/squid, у нас він має наступний вигляд:

#
#Logrotate fragnment for squid.
#
/var/log/squid/*.log (
daily
compress
delaycompress
rotate 2
missingok
nocreate
sharedscripts
prerotate
test! -x /usr/sbin/sarg-reports || /usr/sbin/sarg-reports
endscript
postrotate
test! -e /var/run/squid.pid || /usr/sbin/squid -k rotate
endscript
}

Розберемо його структуру докладніше. Перший рядок вказує шлях до файлів логів, що обробляється. У даному випадкуобробляються всі файли в директорії /var/log/squidвідповідно до наведених нижче опцій:

  • daily- задає щоденну ротацію, для щотижневої чи щомісячної використовуйте weeklyабо monthly.
  • compress- вказує стискати архівні логи, зворотна опція nocompress.
  • delaycompress- не стискати поточний балку до наступної ротації, зазвичай використовується в тих випадках, коли в балку відбувається безперервна запис.
  • rotate 2- кількість ротацій до видалення файлу, в даному випадку зберігатимуться два архіви.
  • missingok- за відсутності файлу журналу вказує на продовження роботи без виведення повідомлення про помилку.
  • nocreate- Не створювати новий файл лога.
  • sharedscripts- використовується для секцій prerotateі postrotate, дана опціявказує виконувати скрипти із цих секцій один раз перед і після ротації всіхлогів, інакше скрипти будуть виконані перед і після ротації кожногологу.

Нижче йдуть секції prerotateі postrotate, кожна з яких закінчується рядком endscript, все, що розташоване між цими рядками виконується перед і після процесу ротації.

Секція postrotateперевіряє, чи запущено squid і запускає ротацію логів самим проксі-сервером. Зупинимося на цьому моменті трохи докладніше. У конфігураційному файлі squid є опція:

Logfile_rotate n

де n- Число ротацій (за замовчуванням 0), тобто. сам squid може зберігати кілька ротацій логів, кожна з яких у свою чергу оброблятиметься logrotate. За замовчуванням дана командапризводить до очищення основного лога squid.

Секція prerotateдодана автоматично при встановленні і якщо файл /usr/sbin/sarg-reportsіснує та є виконуваним, запускає його.

Окремо слід зупинитися на записи команд, конструкція, що використовується в них, може бути незрозуміла з першого разу. У разі використовується подвійне заперечення, якщо заперечення умови хибно, то виконується команда зазначена за символом || (логічне АБО), це пов'язано з логікою роботи команди testта синтаксисом запису файлу ( знак окликупісля test вказує на заперечення умови).

Як бачимо logrotate дозволяє гнучко налаштовувати процес ротації логів. Так якщо ми хочемо формувати статистику використання squid помісячно, то маємо вказати період ротації – місяць та у секції prerotateзмінити команду на формування місячного звіту.

Розгорнутий мною Squidза цією статтею, успішно працює. Але зіткнувся з такою ситуацією, що відразу не зрозумів чому Squidзберігаються вкрай мало і для детального аналізутрафіку проходить у компанії мало.

За замовчуванням ротація логів у Squidвиставлена ​​всього на три дні, тому я розібрався як збільшити термін життя ліг і виставити ротацію ліг в період одного місяця. У моєму випадку цього достатньо.

Здійснювати ротацію логів ми за допомогою системної служби logrotate, що входить до складу Ubuntu Server 14.04.

Нотатка:Ротація ліг здійснює періодичну заміну старих ліг новими, поміщаючи застарілі дані в архів або просто видаляючи їх. Залежно від налаштувань архів ліг може зберігатися як у стислому, так і в стислому вигляді і мати необхідну глибину.

Основні налаштування logrotateзберігаються в /etc/logrotate.conf, налаштування окремих сервісів(у нашому випадку Squid) зберігаються в /etc/logrotate.d/squid, і ці настройки мають пріоритет над logrotate.conf. Сама служба викликається раз на добу через планувальник cron.

Нас цікавить ротація логів лише двох файлів access.logі cache.log. Для файлу access.logми будемо раз на місяць виконувати ротацію, а для файлу cache.logраз на тиждень. Відкриємо для редагування конфігураційний файл

Sudo nano /etc/logrotate.d/squid

Наведемо файл налаштування ротації логів для Squidна вигляд який нам потрібно.

# Щомісячна ротація лог-файлу accesss.log /var/log/squid/access.log ( # daily # weekly monthly compress delaycompress rotate 2 x /usr/sbin/squid || /usr/sbin/squid -$ endscript ) # Щотижнева ротація лог-файлу cache.log sharedscripts postrotate test !-e /var/run/squid.pid ||test !-x /usr/sbin/squid ||

Розберемо структуру написаного вище докладніше. Перший рядок вказує шлях до файлів логів, що обробляється. У цьому випадку обробляються файли access.logі cache.logвідповідно до наведених нижче опцій:

Daily – задає щоденну ротацію weekly – задає щотижневу ротацію monthly – задає щомісячну ротацію compress – вказує стискати архівні логи, зворотна опція nocompress. delaycompress - не стискати поточний балок до наступної ротації, зазвичай використовується в тих випадках, коли в балку відбувається безперервний запис. rotate 2 - кількість ротацій до видалення файлу, в даному випадку зберігатимуться два архіви. missingok - за відсутності файлу журналу вказує на продовження роботи без виведення повідомлення про помилку. nocreate – не створювати новий файл лога. sharedscripts - використовується для секцій prerotate і postrotate, дана опція вказує виконувати скрипти з цих секцій один раз перед і після ротації всіх ліг, інакше скрипти будуть виконані перед і після ротації кожного лога. Секція postrotate перевіряє, чи запущено squidі запускає ротацію логів самим проксі-сервером.

Доповнення: Ще можлива секція. prerotate, вона додається автоматично під час встановлення аналізатора логів SARGі якщо файл / usr/sbin/sarg-reportsіснує та є виконуваним, запускає його. У моєму випадку запускається cron, тому я виключив його з конфігурації.

Т.к. ми ротацію здійснюватимемо виключно службою logrotate, то виправимо конфігурацію squid

Sudo nano /etc/squid/squid.conf

Знаходимо рядок logfile_rotate 6(або додаємо її у разі її відсутності). І приводимо до вигляду

logfile_rotate 0

Підказка: де 6 - Число ротацій, Squidзберігає кілька екземплярів логів, кожен файл лога оброблятиметься logrotate. Число 0 вказує на відключення виконання ротації файлів силами Squid

Зберігаємо Ctrl+Oі закриваємо Ctrl+Xфайл.

Перезапускаємо Squid, нові налаштування набудуть чинності. Ось так легко та просто налаштовується ротація логів.