Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Provide separate Rails log files for each Unicorn worker
after_fork do |server, worker|
# This log hack provides separate log files for each unicorn worker.
# Since Unicorn forks worker processes after loggers are already initialized, by this point other
# things (like ActiveRecord::Base.logger) are already pointing directly at the current
# Rails.logger instance so we can't just point `Rails.logger` elsewhere.
logdev = Rails.logger.instance_variable_get(:@logdev)
ext = File.extname(logdev.dev.path)
path = logdev.dev.path.gsub /#{Regexp.escape(ext)}$/, ".#{worker.nr}#{ext}"
# open the file in the same way rails does:
# https://github.com/rails/rails/blob/4606e75/railties/lib/rails/application/bootstrap.rb#L38-L40
file = File.open(path, 'a')
file.binmode
file.sync = Rails.application.config.autoflush_log
logdev.dev.flush
logdev.dev.close
logdev.instance_variable_set(:@dev, file)
end

ggayan commented Nov 16, 2016

This worked just right for a rails 4 application I am working on above all different solutions I've tried. Commenting here for visibility.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment