Провера здравља VPN-а која сваког минута додаје један ред тихо ствара други задатак: одлучити како ти редови напуштају диск. Поправка тунела не чини ништа за тај задатак, а преименовање датотеке не преусмерава процес који још држи стари дескриптор. Прво одговорите на питање одредишта, затим ускладите ротацију са начином на који је процес отвара.

Изаберите одредиште пре политике ротације

systemd јединица која већ шаље свој излаз у журнал држи чување на једном месту. journald примењује ограничења као што су SystemMaxUse и MaxRetentionSec , па чувар који тамо бележи наслеђује границу без икаквог додатног рада. Додавање другог неограниченог фајла поред њега удвостручује одржавање без користи.

Посвећена датотека заслужује своје место када је чита нешто друго: парсер, извоз за ревизију или страница која очекује стабилну путању. Када је та одлука донета, датотеци су потребни власник, режим и политика ротације записани заједно, јер су сва три тачна само као скуп. Путања коју било ко може да створи је и путања коју било ко може да замени, зато дозволе директоријума припадају истој белешци. Запишите све то поред провере и следећа измена почиње од истих чињеница.

Напишите блок тако да одговара процесу који пише

Почните од процеса који отвара путању при сваком позиву, додаје ред и излази. Тај образац преживљава ротацију без икакве сарадње процеса, јер следеће покретање отвара датотеку која тренутно стоји на тој путањи. Блок испод чува недељу верзија и поново ствара датотеку са власником и режимом који су потребни процесу:

/var/log/vpn-watchdog.log {
    daily
    rotate 7
    create 0600 root root
    missingok
    notifempty
}

Приручник за logrotate дефинише број као број сачуваних ротираних верзија, а не као гаранцију од седам дана историје, а кључна реч daily се процењује када се посао извршава, уместо да делује као сопствени планер. У већини дистрибуција systemd тајмер или cron запис већ поседује тај позив, зато проверите који постоји пре него што додате други. Поклапање власништва је важније од броја чувања. Копирање режима само за root на датотеку коју пише сервисни налог зауставља евидентирање при следећој ротацији, а квар се појављује сатима касније као застарели временски жиг, а не као грешка. Потврдите корисника процеса пре него што копирате блок са другог места.

Процес који никада не отвара поново тражи другачију поправку

Дуготрајан процес који држи отворен дескриптор наставља да пише у преименовани inode. Простор се не ослобађа и видљива датотека престаје да расте, што изгледа као покварена ротација док не проверите inode. Или научите процес да поново отвори, или натерајте ротацију да копира и одсече уместо да преименује.

Путања поновног отварања је чистија тамо где софтвер то подржава: пошаљите документовани сигнал или покрените документовану команду, и пустите процес да сам отвори нову датотеку. Алтернатива је copytruncate , која копира садржај под ротирано име и затим одсеца оригинал на месту, тако да дескриптор остаје важећи, али записи који падну између копирања и одсецања се губе.

За јединице које покреће systemd, усмерите StandardOutput на журнал или на датотеку и пустите јединицу да поседује животни циклус. Shell петља која додаје кроз tee -a без ограничења величине је распоред који током прекида пуни партицију, јер неуспешна провера често бележи много више од здраве.

Тестирајте ротацију без чекања на тајмер

Режим за отклањање грешака извештава шта би се догодило и ништа не дира, што га чини безбедним првим покретањем после измене. Присилите праву ротацију када сте задовољни, затим потврдите да следећи ред дневника пада у нову датотеку, а не у преименовану:

logrotate -d /etc/logrotate.d/vpn-watchdog
logrotate -f /etc/logrotate.d/vpn-watchdog
ls -l /var/log/vpn-watchdog.log*
tail -n 3 /var/log/vpn-watchdog.log
df -h /var/log

Читајте излаз тим редоследом. Пролаз за отклањање грешака треба да именује датотеку и предвиђене радње; присилно покретање треба да произведе очекивано ротирано име; tail треба да покаже свеж запис након што процес поново ради. Растућа вредност df уз видљиву датотеку која се смањује значи горе описани проблем са дескриптором.

Поновите присилно покретање два пута да бисте видели како се чување понаша када верзије већ постоје. Брисање најстарије датотеке је очекивани резултат, а изостанак брисања обично значи да се број или џокер знак у ротираном имену не поклапају са оним што је logrotate створио.

Сачувајте могућност враћања и писани запис

Сачувајте претходни блок пре измене и забележите који га планер покреће, јер враћање које обнови датотеку али не тајмер понавља половину првобитног проблема. Након враћања заротирајте једном ручно, затим потврдите да налог процеса може да пише на путању дневника. Ако услуга ради под systemd, поново учитајте јединицу после сваке измене преусмеравања њеног излаза, јер покренути процес наставља да пише на стари циљ. Прочитајте сами следећих неколико редова дневника уместо да верујете да се јединица вратила чисто.

Забележите режим, власника, број чувања и очекивани диск буџет поред саме провере. Када се провера касније промени из једнократне скрипте у демон, политика ротације мора да се промени са њом, и та белешка каже следећој особи која претпоставка се сломила.

На крају, држите одлуку о дневнику одвојену од одлуке о опоравку. Неуспешна провера треба да прати сопствену политику опоравка везе, а не правило сакривено у logrotate, и ниједан распоред евидентирања не треба да буде разлог да се поново покрене тунел који ради.

Повезани чланци