Merb - kolorowy logger
31 października 2008Merb wczoraj został wypuszczony na świat w wersji RC4. Z tej okazji* rozpoczynam cykl kilku postów z przydatnymi sztuczkami związanymi z tym właśnie frameworkiem. Na pierwszy ogień idzie kolorowanie wiadomości z merbowego loggera.
Merb.logger jak sama nazwa służy do logowania informacji. Jakich i gdzie zależy od ustawień dla danego środowiska (config/environments/*.rb). Pliki konfiguracyjne merba są proste, czytelne i opatrzone komentarzem, więc nie ma sensu ich opisywać. Istotne natomiast jest to, że czasami łatwo się w logach pogubić, szczególnie podczas pracy nad projektem. Merb loguje wszystko tak samo - jako zwykły tekst. I tu właśnie narodził się pomysł, żeby informacje różnego typu pokazywać w różnych kolorach, tak aby od razu było wiadomo co jest co i ułatwić szukanie interesujących nas linijek.
Poniżej znajduję się "patch" który koloruje logi w zależności od poziomu.
# lib/color_logger.rb module Merb class Logger # 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white Colors = Mash.new({ :fatal => 31, :error => 31, :warn => 33, :info => 37, :debug => 36 }) Levels.each_pair do |name, number| class_eval <<-LEVELMETHODS, __FILE__, __LINE__ def #{name}(message = nil) self << "\033[0;#{Colors[name]}m%s\033[0m" % message if #{number} >= level self end def #{name}!(message = nil) self << "\033[0;#{Colors[name]}m%s\033[0m" % message if #{number} >= level flush if #{number} >= level self end LEVELMETHODS end def my_debug(message = nil) self << "\033[1;35m%s\033[0m" % message self end end end
Aby kolorowanie działało tylko w trybie development wystarczy dodać require "lib/color_logger.rb" w pliku config/environments/development.rb i jest to chyba najlepsze rozwiązanie. W trybie production i tak zazwyczaj logujemy do pliku a nie na STDOUT więc kolorowanie tylko by zaśmiecało pliki.
Niektórych pewnie dziwi metoda my_debug. Dodałem ją dlatego, iż datamapper korzysta z Merb.logger.debug do logowania zapytań do bazy, co nieco utrudnia znalezienie naszego własnego wywołania, a tak Merb.logger.my_debug(var) i od razu rzuca się w oczy ;) Do tego prosty helper:
# app/helpers/global_helpers.rb def d(var) Merb.logger.my_debug(var.inspect) end
Kolory oczywiście można sobie pozmieniać. Można też wyłączyć logowanie zapytań do bazy poprzez:
# config/init.rb Merb::BootLoader.after_app_loads do DataObjects::Postgres.logger = DataObjects::Logger.new(File.open('/dev/null', 'w'), Merb.logger.level) end
I to by było na tyle jeśli chodzi o kolorowanie logów w konsoli. Smacznego ;)
W następnych odcinkach m.in. flash, String#t, error_messages_for i prostsze formularze.
* Jakiś powód musiałem wymyślić :P
1 komentarz
Awesome teamon! I blogged about your logger patch, thanks.
http://www.merbing.com/2008/10/31/adding-color-to-your-merb-logger
Peter.