logrotate składnia pliku konfiguracyjnego - czy możliwe jest wprowadzenie wielu symboli wieloznacznych?

83

Ponieważ strona podręcznika nie odpowiada na moje pytanie i nie chcę wymuszać cyklu rotacji, postanowiłem zadać pytanie tutaj.

Strona podręcznika dla programu logrotate podaje następujący przykład:

   "/var/log/httpd/access.log" /var/log/httpd/error.log {
       rotate 5
       mail [email protected]
       size 100k
       sharedscripts
       postrotate
           /usr/bin/killall -HUP httpd
       endscript
   }

Wszystkie przykłady z symbolami wieloznacznymi zawierają tylko jeden wpis. Teraz interesuje mnie to, czy ten jest również dozwolony:

   /var/log/httpd/*.log /var/log/httpd/*/*.log {
       # ... same as above
   }

Oto uzasadnienie: mam wiele vhostów i podzieliłem je przez użytkownika, który „jest właścicielem” tych vhostów. Ponieważ pliki dziennika są odczytywalne na całym świecie, chcę podłączyć folder do katalogu domowego użytkownika, ale ogranicz go do plików dziennika, które użytkownik „posiada”, co jest najłatwiejsze dzięki oddzieleniu dzienników na foldery (i powiązanie -montowanie i tak wymaga tego schematu). Dlatego szukam rozwiązania, aby obrócić zarówno pliki dziennika w ramach, /var/log/httpdjak i wszystkie pliki dziennika w podkatalogach tego katalogu - bez konieczności wyświetlania każdego podkatalogu według nazwy.

Zasadniczo strona man nie daje pojęcia, czy wiele reguł jest w ogóle możliwych dla reguł wieloznacznych, czy tylko dla pełnych ścieżek. Używam Logrotate w wersji 3.7.8-6, która jest dostarczana z Debianem „Squeeze”, ale uważam, że niekoniecznie jest to specyficzne dla dystrybucji lub wersji programu.

0xC0000022L
źródło

Odpowiedzi:

119

Tak, możesz użyć wielu dzikich kart. Możesz przetestować plik bez wykonywania rzeczywistych obrotów, wykonując następujące czynności:

logrotate -d -f /etc/logrotate.conf
  • -d = Włącza tryb debugowania. W trybie debugowania nie zostaną wprowadzone żadne zmiany w dziennikach ani w pliku stanu logrotate.

  • -f = Mówi logrotate, aby wymusił obrót, nawet jeśli nie uważa, że ​​jest to konieczne. Czasami jest to przydatne po dodaniu nowych wpisów do logrotate lub jeśli stare pliki dziennika zostały usunięte ręcznie, ponieważ nowe pliki zostaną utworzone, a rejestrowanie będzie kontynuowane poprawnie. ”

Dennis Williamson
źródło
3
wielkie dzięki! Właśnie wypróbowałem i działa. Z danych wyjściowych wynika, że ​​można oczekiwać, że symbole wieloznaczne będą działać tak jak w powłoce.
0xC0000022L,
24

Chciałem tylko to wyjaśnić, ponieważ właśnie to tutaj znalazłem, szukając sposobu, jak to zrobić,

Dozwolone jest określenie wielu plików dziennika dla pojedynczej konfiguracji, np

/var/log/httpd/access.log
/var/log/httpd/error.log
/var/log/httpd/mysite/*.log
{
    rotate 5
    mail [email protected]
    size 100k
    sharedscripts
    postrotate
        /usr/bin/killall -HUP httpd
    endscript
}
ThorSummoner
źródło
//, Czy nie ma problemu z różnymi ścieżkami występującymi w wielu liniach?
Nathan Basanese
@NathanBasanese Nie rozumiem w pełni twojego pytania, myślę, że możesz wskazać ścieżki do plików w dowolnym miejscu na dysku, który ci się podoba, nie wszystkie muszą mieć ten sam prefiks katalogu.
ThorSummoner,
@NathanBasanese och, myślę, że rozumiem, mając wiele celów rotacji logów na różnych liniach wydaje się być normalnym zastosowaniem, skopiowałem ten formularz z innych skryptów logrotate.d, na przykład /etc/logrotate.d/rsyslog
ThorSummoner
4

Ze strony podręcznika użytkownika dla logrotate :

Należy pamiętać, że nazwy plików dziennika mogą być ujęte w cudzysłowy (i że cudzysłowy są wymagane, jeśli nazwa zawiera spacje). Obowiązują normalne reguły cytowania powłoki z obsługiwanymi znakami „,” i \.

Pamiętaj, aby zmodyfikować lub usunąć znaki cudzysłowu przy przechodzeniu od jednego do wielu wzorów:

To działa:

/var/log/*.log /var/log/*.blog {

to też działa:

/var/log/*.log
/var/log/*.blog {

To nie działa:

'/var/log/*.log /var/log/*.blog' {

i ani to:

"/var/log/*.log /var/log/*.blog" {

Porównaj z przypadkiem pojedynczego wzoru.

To działa:

'/var/log/*.log' {

i to też działa:

"/var/log/*.log" {

Testowane z logrotate 3.10.0

Piotr Dobrogost
źródło
2
Byłoby ciekawie wiedzieć, czy to "/var/space /log/*.log" "/var/log/*.blog"
zadziała