2013-05-14 18 views
7

Rails dostarczany jest z biblioteką standardową w klasie Rubiego logger. Dostępne poziomy rejestrowania to: :debug, :info, :warn, :error i :fatal.Logowanie w Railsach, czy jest jakaś skuteczność?

Zastanawiam się, czy mogę dodać obszerne logowanie w mojej aplikacji Railsowej z ustawionym poziomem logowania na :debug dla rozwoju i testowania, czy wystąpi wpływ na wydajność podczas uruchamiania w produkcji z wyłączonym wylogowaniem lub ustawieniem na wyższym poziomie, na przykład config.log_level = :fatal?

Odpowiedz

17

Krótka odpowiedź oznacza, że ​​rejestrowanie zawsze będzie miało wpływ na wydajność, szczególnie podczas logowania na dysk. Istnieje jednak kilka subtelności.

Po pierwsze, użycie poziomu :debug będzie miało wyższą karę wykonania niż :fatal, ponieważ o wiele większa liczba ciągów jest oceniana i zapisywana na wyjściu dziennika (np. Dysku).

Inną potencjalną pułapką jest to, że jeśli masz wiele połączeń jak to w kodzie:

logger.debug = "my string to debug with a #{variable}" 

Nie będzie wpływ wydajność nawet jeśli dozwolony poziom wyjściowy nie obejmuje debugowania. Powodem jest to, że Ruby musi ocenić te łańcuchy, co obejmuje instancję nieco ciężkiego obiektu String i interpolację zmiennych, a to wymaga czasu.

Dlatego zaleca się przekazywanie bloków do metod rejestratora, ponieważ są one oceniane tylko wtedy, gdy poziom wyjściowy jest taki sam lub uwzględniony w dozwolonym poziomie (tj. leniwy ładowanie). Ten sam kod przepisany byłoby:

logger.debug { "my string to debug with a #{variable}" } 

Zawartość bloku, a więc ciąg interpolacji, oceniana jest tylko wtedy, gdy debugowanie jest włączone. Oszczędności związane z wydajnością są zauważalne tylko przy dużej ilości rejestrowania, ale jest to dobra praktyka.

Możesz przeczytać więcej na ten temat w Logger docs.

+1

Nie wiedziałem, że możesz przekazać bloki do rejestratora. Idealny! – CuriousMind

Powiązane problemy