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.
Nie wiedziałem, że możesz przekazać bloki do rejestratora. Idealny! – CuriousMind