Merb: kolorowy logger
Merb 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
Looking for comments section?
Send me an email instead to [email protected]