Czyszczenie bazy z logami
Mam pod opieką serwer, który generuje bardzo duże ilości logów. Nie byłoby w tym nic strasznego, gdyby nie to, że dosyć często trzeba do tych logów zaglądać, bo – jak to w logach – znajdują się tam cenne dla nas informacje. Jeszcze gorzej, że do tych informacji muszą mieć dostęp nie tylko administratorzy, ale także pracownicy helpdesku, dla których grep i potoki w konsoli linuksowej nie są specjalnie przyjazne i intuicyjne. Na szczęście w miarę prosto można zmienić konfigurację syslog’a w CentOSie tak, żeby (obok pliku) zapisywał logi do bazy danych. Jeżeli mamy działający serwer MySQL, to cała procedura zamyka się w utworzeniu odpowiedniej bazy na serwerze (nie zapomnijmy o odpowiednich prawach dostępu!) oraz zmianie pliku konfiguracyjnego /etc/rsyslog.conf. Fajny dokument opisujący jak skonfigurować rsysloga do pracy z MySQLem można znaleźć TUTAJ (warto od razu przeczytać także TO).
Wszystko pięknie, tylko nasz bohater generuje kilkaset tysięcy wpisów dziennie, wobec czego w bardzo niedługim czasie baza przestałaby być używalna, bo przeszukiwanie jej zajmowałoby strasznie dużo czasu. Niezupełnie o to nam chodzi. Szczególnie, że użyteczne dla nas są jedynie te wpisy, które zostały utworzone w ciągu ostatniego tygodnia (starsze i tak są archiwizowane w postaci „standardowych” plików sysloga, a potrzeba dostępu do nich zdarza się niezmiernie rzadko).
I tutaj z pomocą przychodzi cron i taki oto króciutki skrypcik:
#!/bin/bash
echo "DELETE FROM SystemEvents WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) >= DeviceReportedTime;" | mysql -h db_host -u db_user --password=db_pass Syslog
Zrobiłem dowiązanie symboliczne do tego pliku w katalogu /etc/cron.daily i mogę zająć się innym problemem :-)