Jaki jest najlepszy sposób na włączenie rotacji logów w aplikacji produkcyjnej Ruby on Rails?
Czy odbywa się to za pomocą logrotate na serwerze hostingowym, czy też istnieje zestaw opcji do użycia podczas inicjowania rejestratora z aplikacji?
Jaki jest najlepszy sposób na włączenie rotacji logów w aplikacji produkcyjnej Ruby on Rails?
Czy odbywa się to za pomocą logrotate na serwerze hostingowym, czy też istnieje zestaw opcji do użycia podczas inicjowania rejestratora z aplikacji?
Odpowiedzi:
Możesz skonfigurować szyny, aby używać narzędzi dziennika systemowego.
Przykład w config / environment / production.rb .
# Use a different logger for distributed setups
config.logger = SyslogLogger.new
W ten sposób logujesz się do syslog i możesz używać domyślnych narzędzi logrotate do obracania dzienników.
Inną opcją jest po prostu skonfigurowanie logrotate do zbierania kłód pozostawionych przez szyny. W systemach Ubuntu i Debian będzie to na przykład plik o nazwie /etc/logrotate.d/rails_example_com
.
/path/to/rails.example.com/tmp/log/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
copytruncate
}
Zgodnie z poniższymi sugestiami, w Railsach zaleca się użycie copytruncate
, aby uniknąć konieczności ponownego uruchamiania aplikacji Rails.
Edycja: usunięto "sharedscripts / endcript", ponieważ nie są one tutaj używane i powodują problemy zgodnie z komentarzem. I usunięte create 640 root adm
zgodnie z sugestią komentarza.
logrotate
rozwiązania, warto odpowiedzieć @ amit-saxena - sugeruje użycie copytruncate
ponad create
dyrektywy.
copytruncate
, create
nie ma efektu, więc prawdopodobnie powinieneś usunąć go ze swojego przykładu
su your_rails_user your_rails_group
z właścicielem i grupą twoich plików dziennika (tj. Tych z procesu Rails / Passenger) lub (ostatnie wersje?) Logrotate może narzekać na uprawnienia.
Jeśli używasz logrotate, możesz wybrać jedną z poniższych opcji, umieszczając plik conf w katalogu /etc/logrotate.d/.
# Rotate Rails application logs based on file size
# Rotate log if file greater than 20 MB
/path/to/your/rails/applicaton/log/*.log {
size=20M
missingok
rotate 52
compress
delaycompress
notifempty
copytruncate
}
Lub
# Rotate Rails application logs weekly
/path/to/your/rails/applicaton/log/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
copytruncate
}
Należy pamiętać, że copytruncate tworzy kopię zapasową bieżącego dziennika, a następnie czyści plik dziennika w celu kontynuowania zapisu. Alternatywą jest użycie funkcji create, która wykona obrót przez zmianę nazwy bieżącego pliku, a następnie utworzenie nowego pliku dziennika o tej samej nazwie co stary plik. Zdecydowanie zalecam używanie copytruncate, chyba że wiesz, że potrzebujesz utworzyć. Powodem jest to, że Railsy mogą nadal wskazywać na stary plik dziennika, mimo że jego nazwa uległa zmianie i mogą wymagać ponownego uruchomienia w celu zlokalizowania nowego pliku dziennika. copytruncate pozwala uniknąć tego, zachowując ten sam plik, co plik aktywny.
logrotate --force $CONFIG_FILE
, określając lokalizację pliku konfiguracyjnego, aby uruchomić go ręcznie.
W przypadku Rails 5 musiałem to zrobić, aby ograniczyć rozmiar dziennika i nie zmieniać wyjścia serwera w konsoli:
Zgodnie z dokumentacją , jeśli chcesz ograniczyć rozmiar folderu dziennika, umieść to w pliku środowiska („development.rb” / „production.rb”).
config.logger = ActiveSupport::Logger.new(config.paths['log'].first, 1, 50 * 1024 * 1024)
Dzięki temu Twoje pliki dziennika nigdy nie będą większe niż 50 MB. Możesz zmienić rozmiar według własnych preferencji. Wartość „1” w drugim parametrze oznacza, że zostanie zachowany 1 plik dziennika, więc będziesz mieć do 100 MB dzienników - bieżący dziennik i poprzedni fragment o wielkości 50 MB.
config.paths['log'].first
bym umieścićRails.root.join('log', "#{Rails.env}.log")
config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
50.megabytes
jest takie samo 50 * 1024 * 1024
, ale znacznie łatwiejsze do zrozumienia. Aby uzyskać więcej informacji, zobacz podstawowe rozszerzenia ActiveSupport .
Rails.application.config.paths['log'].first
zwróci dokładnie ten plik
W przypadku Rails 5 , jeśli chcesz mieć codzienną rotację dzienników, potrzebujesz tylko tego:
config.logger = ActiveSupport::Logger.new(config.paths['log'].first, shift_age = 'daily')
Zgodnie z dokumentacją , można użyć daily
, weekly
lub monthly
.
Dla każdego logu: Rails log, Rpush log, ... Możesz użyć tego w swoim pliku konfiguracyjnym usługi:
config.log_file = 'log/rpush.log'
config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
Oznacza to: po podziale zapisz tylko 1 poprzedni plik dziennika. Rozmiar głównego dziennika nigdy nie przekracza 20 MB.
Włącz wysyłanie dzienników do loggly przy użyciu logglier rails, jak pokazano w moim pliku environment / production.rb. wersja railsów to 4.1.0
RailsApplication::Application.configure do
require 'logglier'
config.logger = Logglier.new(<https://logs-01.loggly.com/inputs/inputkey>)
log.info("hello from logglier")
end