Napačno delujoča skripta PHP ali vtičnik lahko v dnevnik vsako minuto zapiše več tisoč opozoril, datoteke error_log, ki nastajajo v mapah spletnega mesta, pa lahko v nekaj dneh zrastejo do gigabajtov. Ta članek pokaže, kako jih najdeš z ukazom find, kako sprostiš prostor, ne da bi pri tem povzročil novo napako, in kaj storiti, da ne zrastejo znova.
Ukaze smo preizkusili na testnem računalniku z AlmaLinux 10.2, na vzorčnem imeniku. Zaganjaj jih v mapi spletnega mesta (na primer ~/public_html); . vedno pomeni trenutni imenik.
Na gostovanju cPanel aWh PHP privzeto beleži v datoteko logs/php.error.log domačega imenika, zato v mapah spletnega mesta error_log nastaja redkeje. Pri starejših nastavitvah, na drugih strežnikih in pri nekaterih aplikacijah pa je pogost.
1. Seznam datotek error_log z velikostmi
find . -type f -name error_log -exec du -sh {} +
-type f: išče le datoteke;-name error_log: le tiste z natanko imenomerror_log(-inameišče neodvisno od velikih in malih črk);-exec du -sh {} +: velikost najdenih datotek izpišedu.{} +datoteke preda enemu samemu klicudu, kar je pri veliko datotekah hitrejše od{} \;(en klic na datoteko).
Skupna velikost vseh error_log:
find . -type f -name error_log -print0 | du -ch --files0-from=- | tail -1
2. Le velike: stikalo -size
find . -type f -name error_log -size +100M -exec ls -lh {} \;
-size +100M vrne datoteke, večje od 100 MB. Pri gigabajtih pazi na enoto:
-size +1Gpomeni datoteke, večje od 1 GiB (1 073 741 824 bajtov);-size +1000000000c(cpomeni bajt) tiste, večje od milijarde bajtov, kar je nekoliko manj.
V preizkusu je -size +1000000000c našel error_log z 1010 MB, -size +1G pa ne; datoteko z 1,1 GB sta našla oba. find zaokroža navzgor, zato -size +1G datoteke z 1 GiB še ne najde, le večjo. Za natančnejšo mejo jo navedi v megabajtih: -size +1024M.
3. Sprostitev prostora: praznjenje namesto brisanja
Dnevniške datoteke v uporabi ne briši (rm), temveč jo izprazni:
find . -type f -name error_log -size +100M -exec truncate -s 0 {} +
truncate -s 0 datoteko skrajša na nič bajtov, datoteka sama ostane. Če tekoči program (spletni strežnik, PHP-FPM) dnevnik ravno drži odprt, se prostor izbrisane datoteke ne sprosti, dokler se program znova ne zažene: po df bo disk še vedno poln, datoteke pa ne boš več videl nikjer. Ta pojav in njegovo odpravo predstavlja članek Disk je poln, du pa tega ne pokaže.
Če jo vseeno želiš izbrisati, ker je zagotovo nič ne uporablja (na primer v mapi stare, neobstoječe aplikacije):
find . -type f -name error_log -size +100M -delete
Brisanje je dokončno, koša ni. Pred zagonom si vedno oglej seznam brez -delete.
4. Preden jo izprazniš: poglej, kaj je v njej
Velik error_log je simptom, ne vzrok: ista napaka ga v nekaj dneh znova napolni. Zadnje vrstice pokažejo, katera datoteka in katera vrstica ga povzroča:
tail -n 20 error_log
Povzetek najpogostejših sporočil (brez datuma):
cut -d']' -f2- error_log | sort | uniq -c | sort -rn | head
Če je večina vrstic PHP Deprecated ali PHP Warning, se različica PHP in različica vtičnika ne ujemata: posodobi vtičnik ali predlogo. Če je PHP Fatal error, del spletnega mesta sploh ne deluje. Pri WordPressu o iskanju napak piše članek Način za odpravljanje napak WordPress (WP_DEBUG).
5. Da ne zraste znova
- Odpravi napako, ki ustvarja vrstice (glej prejšnjo točko).
- Na produkcijskem spletnem mestu opozoril ne prikazuj in ne beleži množično: v datoteki
php.iniali.user.inierror_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICEobdrži le pomembne napake (glej: Uporaba datoteke .user.ini za nastavitev parametrov PHP). - Na lastnem strežniku sistemske dnevnike vrti in stiska
logrotate; to ne velja za datotekeerror_logspletnih mest, razen če zanje napišeš posebno pravilo.
O pregledu celotne porabe diska govori članek o ukazih du in df, na gostovanju cPanel pa članek Preverjanje porabe diska v cPanelu.