ruby-on-railsdatabaseserverapartment-gem

Apartment gem - Adding current database to all server logs


I am using the Apartment gem to switch the tenant (database) being used for a multi tenancy Rails application.

In my server logs I would like to output the current tenant (database) being used for every single line in the log file.

When I do rails s the server never actually starts with the code below that is in the initializers directory. The server just hangs... so odd. No error message and no running server. If I take out #{Apartment::Tenant.current} below everything is fine... but... I really want to know the current tenant (database) in my log files.

/initializers/log_formatting.rb:

class ActiveSupport::Logger::SimpleFormatter 
  def call(severity, time, progname, msg)
    "#{Apartment::Tenant.current} #{msg.strip} (pid:#{$$})\n"
  end
end

Any ideas on how to get the current tenant (database) being used output to every line of my log file?

Thank you!


Solution

  • I would suggest you to use log_tags. From the rails documentation :

    config.log_tags accepts a list of: methods that the request object responds to, a Proc that accepts the request object, or something that responds to to_s. This makes it easy to tag log lines with debug information like subdomain and request id - both very helpful in debugging multi-user production applications.

    You can add this configuration in application.rb or production.rb whichever fits your need.

    For ex: config.log_tags = [ :subdomain, :request_id, lambda { |request| request.headers["tenant_name"] } ]

    Note: In case you are adding this for development environment and you are running on your_subdomain.localhost:3000 then subdomain won't be present as localhost doesn't support subdomains. There are some workarounds like modifying /etc/hosts file but i won't recommend it. The more cleaner solution is to use your_subdomain.lvh.me:3000