Obecnie aktualizujemy z Ubuntu 12.04 LTS do 14.04 LTS na naszych serwerach aplikacji ruby on rails i zauważyliśmy, że pliki dziennika już się nie obracają.
Na obu komputerach mamy plik /var/app-name/config/logrotate
należący do naszego użytkownika unix, deployer
który zawiera prawidłowy plik logrotate w następujący sposób:
/var/app-name/log/*.log {
daily
rotate 365
delaycompress
compress
dateext
dateformat -%Y%m%d
missingok
copytruncate
}
To jest następnie symlinkowane do /etc/logrotate.d/
katalogu jakoapp-name
Na naszym serwerze Ubuntu 12.04 mamy logrotate 3.7.8, który działa dobrze. Przechodzi do var/app-name/log/
katalogu i obraca wszystkie pliki dziennika
Ale na serwerze Ubuntu 14.04 mamy logrotate 3.8.7, która nie obraca plików logów dla naszej aplikacji.
Kiedy debuguję to za pośrednictwem sudo logrotate -d -f /etc/logrotate/.conf
, otrzymuję następujące dane wyjściowe:
Ignoring /etc/logrotate.d/app-name because the file owner is wrong (should be root).
Ścigając to w kodzie, wydaje się, że ta zmiana została dodana do strumienia wydania 3.8.x: https://github.com/demands/logrotate/commit/b8ce386a969c60e5c8ee78023c24a1ba0aab1526
Jeśli zmienię własność dowiązane do pliku /var/app-name/config/logrotate
, aby root
następnie zacznie ponownie działać. Ale biorąc pod uwagę, że ten plik jest częścią mojej aplikacji i został utworzony przez środowisko wdrażania capistrano, którego używamy w tym stanie, wolałbym nie zmieniać jego własności, gdy działało dobrze.
Więc czy pliki konfiguracyjne z dowiązaniami symbolicznymi są polecane / obsługiwane przez logrotate?
A jeśli tak, to czy odmowę użycia mojego pliku (będącego własnością deployer
), który jest dowiązany do /etc/logrotate.d
katalogu, należy uznać za błąd?
Czy istnieje inne zalecane podejście do rotacji dzienników specyficznych dla aplikacji?
(pytany także o Unix StackExchange )
źródło
Odpowiedzi:
Problem polega na tym, że plik konfiguracyjny logrotate może uruchamiać dowolne polecenie jako root (używając sekcji prerotate / postrotate). Dlatego skutecznie nadawałbyś
deployer
uprawnienia użytkownika root, umożliwiając mu zapis do plików/etc/logrotate.d/
. Więc nie, to nie jest błąd.Jeśli ufasz swojemu użytkownikowi wdrażającemu, myślę, że możesz rozwiązać problem, przyznając mu prawo sudo do kopiowania plików
/etc/logrotate.d/
. Zakładając oczywiście, że użytkownik wdrażający nie jest tym samym użytkownikiem, co aplikacja internetowa.źródło
Zdaję sobie sprawę, że jestem trochę spóźniony na przyjęcie, ale miałem podobny problem i pomyślałem, że podzielę się moim rozwiązaniem.
Moje problemy zaczęły się, gdy
logrotate
nie przeczytałem konfiguracji, którą napisałem. Nie chciałem wdrażać nowych konfiguracji w folderze należącym do roota, ponieważ nie chciałem, aby użytkownik wdrażania miał dostęp do konta root do czegokolwiek .Na początku próbowałem uruchomić
logrotate
jako użytkownik wdrażania, ale narzekał na dostęp do pliku stanu pod adresem/var/lib/logrotate/state
. Potem przeczytałem stronę podręcznika. Możesz określićlogrotate
używany plik stanu ! Wydawało mi się, że lepszym rozwiązaniem jest skonfigurowanie codziennego crona do wykonywanialogrotate
jako użytkownik wdrażania z niestandardowym plikiem stanu. W ten sposób użytkownik wdrażania ani aplikacja nie potrzebują dostępu do konta root.Oto jak określić plik stanu:
Teraz możesz uruchomić logrotate jako dowolny użytkownik i właściciel konfiguracji, który ci się podoba!
źródło