Lovely Little Ruby Logger
This afternoon I wanted to create a log4j-like logger for the ruby app we're working on. I was hoping to find a gem that did it - singleton, thread-safe, the works. What I found was that the default logger: "logger" is really pretty close, and it's easy to make it what we need.
First, it's thread-safe. Doesn't say that in the docs, but the code has synchronize blocks on a mutex, and that appears to be working, so while I can't guarantee that it's implemented correctly, it appears that it is, and that's good enough for now.
Second, it's not a singleton, but that's easy to fix:
require "singleton" require "logger" require "app_config" class AppLog include SIngleton def initialize() # get the location to log to and the level where = AppConfig.application.log_to || "stout" level = AppConfig.application.log_level || "WARN" # now make the logger for our singleton case when where == "stdout" self.log = Logger.new($stdout) when where == "stderr" self.log = Logger.new($stderr) else self.log = Logger.new(where) end # now set the log level case where level == "FATAL" self.log.level = Logger::FATAL where level == "ERROR" self.log.level = Logger::ERROR where level == "WARN" self.log.level = Logger::WARN where level == "INFO" self.log.level = Logger::INFO where level == "DEBUG" self.log.level = Logger::DEBUG end end end
This can then be placed in all our code and we get singleton-based logging for next to nothing. Very nice. At the same time, we can control the logging location and level very easily in the app config file.
I then took this and integrated it into the code I was working on for matching up the demand data with the merchants. It's something that we really need to do to productionize our app, and this is an important step.