GNU/Linux >> Znalost Linux >  >> Linux

Logrotate Úspěšné, původní soubor se vrátí do původní velikosti

Ř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.


Linux
  1. Jak vytvořit soubor s danou velikostí v Linuxu?

  2. Přenosný způsob, jak získat velikost souboru (v bajtech) v shellu?

  3. Linux odstranit soubor s velikostí 0

  1. Jak získat velikost tar.gz v (MB) souboru v pythonu

  2. sledovat velikost souboru v linuxu

  3. Velikost souboru ve formátu čitelném pro člověka

  1. Rozdíl ve výpočtu velikosti adresáře?

  2. Nastavení Centos/Linux logrotate na maximální velikost souboru pro všechny protokoly

  3. Size() vs ls -la vs du -h která velikost je správná?