Řešení 1:
Je to pravděpodobně proto, že i když soubor zkrátíte, proces zápisu do souboru bude pokračovat v zápisu s jakýmkoli posunem, který byl nakonec. Takže to, co se děje, je, že logrotate zkrátí soubor, velikost je nula, proces znovu zapíše do souboru, pokračuje v offsetu, kde skončil, a nyní máte soubor s NULL-bajty až do bodu, kdy jste jej zkrátili plus nový záznamy zapsané do protokolu.
od -c po zkrácení + náhlý růst, generovaný výstup ve smyslu:
0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
33255657600 \0 C K B - s e r v e r [ h t t
33255657620 <more log output>
To říká, že od offsetu 0 do 33255657600 se váš soubor skládá z prázdných bajtů a pak z některých čitelných dat. Dostat se do tohoto stavu nezabere stejnou dobu, jako by skutečně zapsalo všechny ty nulové bajty. Souborové systémy ext{2,3,4} podporují něco, čemu se říká řídké soubory, takže pokud prohledáváte oblast souboru, který nic neobsahuje, bude se předpokládat, že tato oblast obsahuje nulové bajty a nebude zabírat místo na disku. Tyto nulové bajty nebudou ve skutečnosti zapsány, pouze se předpokládá, že tam jsou, a proto doba, kterou trvá přechod na 0 až 3,5 GB, nezabere mnoho času. (Čas, který to zabere, můžete otestovat tak, že uděláte něco jako dd if=${HOME}/.bashrc of=largefile.bin seek=3432343264 bs=1
, to by mělo během několika milisekund vygenerovat soubor větší než 3 GB).
Pokud spustíte ls -ls
na vašich souborech protokolu poté, co byly zkráceny a došlo k opětovnému náhlému nárůstu, by nyní měl na začátku řádku hlásit číslo, které představuje skutečnou velikost (v blocích obsazených na disku), které je pravděpodobně řádově menší než velikost nahlášená pouze ls -l
.
Řešení 2:
Jsem extrémně přesvědčen, že to Kjetil trefil. Drewe, možná vás jeho vysvětlení ještě nepřesvědčilo, ale vyzývám vás, abyste si pozorně přečetl, co řekl.
Pokud to přijmete, opravou je buď zastavit a restartovat vaši aplikaci, když se protokoly otočí, nebo použít nástroj, jako je „rotatelogs“ od Apache, kde výstup protokolu přivedete do nástroje potrubím a nástroj se postará o častým otáčením souboru protokolu. Například jedna z mých instancí Apache se přihlásí pomocí
ErrorLog "|/usr/sbin/rotatelogs /www/logs/error_log 604800"
což způsobuje mnoho souborů protokolu s názvy jako
-rw-r--r-- 1 root root 4078 Dec 21 01:04 error_log.1292457600
-rw-r--r-- 1 root root 4472 Dec 29 08:41 error_log.1293062400
-rw-r--r-- 1 root root 78630 Jan 4 12:57 error_log.1293667200
-rw-r--r-- 1 root root 15753 Jan 12 01:10 error_log.1294272000
zobrazí se bez restartování apache; Poté je mohu komprimovat ručně. Všimněte si, jak se rotace provádí každý týden, což je každých 604 800 sekund, což je argument předaný do rotatelogs
.
Pokud nemůžete zastavit a restartovat aplikaci a nemůže se přihlásit přes potrubí, pak si myslím, že máte skutečný problém. Možná budou mít další návrhy.