Redirect-Logger-Ausgabe für eine bestimmte Steuerung in Rails 4
Ich habe eine Lösung basierend auf der Antwort in meiner vorherigen Frage erstelltRedirect-Logger-Ausgabe für eine bestimmte Steuerung in Rails 3 für Rails 3. Es funktioniert hervorragend, aber jetzt versuche ich, die gleiche Middleware-basierte Lösung auf ein Rails 4-Projekt anzuwenden, aber es gibt einige Unterschiede, die verhindern, dass dieselbe Lösung funktioniert.
Die Rails 3-Lösung:
module MyApp
class LoggerMiddleware
REPORTS_API_CONTROLLER_PATH = %r|\A/api/v.*/reports.*|
REPORTS_API_CONTROLLER_LOGFILE = "reports_controller.log"
def initialize(app)
@app = app
@logger = Rails::logger
.instance_variable_get(:@logger)
.instance_variable_get(:@log)
@reports_api_controller_logger = Logger.new(
Rails.root.join('log', REPORTS_API_CONTROLLER_LOGFILE),
10, 1000000)
end
def call(env)
Rails::logger
.instance_variable_get(:@logger)
.instance_variable_set(:@log,
case env['PATH_INFO']
when REPORTS_API_CONTROLLER_PATH then
@reports_api_controller_logger
else
@logger
end
)
@app.call(env)
end
end
end
Rails.application.middleware.insert_before Rails::Rack::Logger, MyApp::LoggerMiddleware
in obigem
Rails 3 getter für Rails.logger =Rails::logger.instance_variable_get(:@logger).instance_variable_get(:@log)
Rails 3Sette für Rails.logger (Einstellung auf @my_logger) =Rails::logger.instance_variable_get(:@logger).instance_variable_set(:@log,@my_logger)
Eine Sache, die mir sofort aufgefallen ist, ist, dass in Rails 4 die oben genanntenRails::logger.instance_variable_get(:@logger).instance_variable_get(:@log)
gibt null zurück.
enn ich in der Rails 4-Konsole nachschaue, sehe ich, dassRails.instance_variable_get(:@logger)
kehrt zurück#<ActiveSupport::Logger:0x007f84ff503a08 ....>
Ich habe versucht, das @ zu ersetz getter mitRails.instance_variable_get(:@logger)
und der Setter mitRails.instance_variable_set(:@logger,my_logger)
und es scheint fast zu funktionieren. Der erste Teil der Aktivität, "Gestartet ...", wechselt in die neue Protokolldatei, danach in die Standardprotokolldatei (der Rails.logger vor der Änderung durch die Middleware).
EntwederRails.instance_variable_get(:@logger)
ist nicht das niedrigste Level-Äquivalent in Rails 4 zu Rails 3Rails::logger.instance_variable_get(:@logger).instance_variable_get(:@log)
zum bekommen / setzen the Rails.logger oder es gibt später im Prozess etwas anderes nach meiner Middleware, das dies überschreibt, nachdem ich es festgelegt habe.
Irgendwelche Hinweise
Aktualisieren
Um dies zu verdeutlichen, funktioniert die oben aufgeführte Lösung in Rails 3 wie erwartet. Alle Einschränkungen, die in speziellen Umgebungen bestehen oder nicht (z. B. wenn die Lösung in Threading-Serverumgebungen möglicherweise nicht funktioniert, wenn dies der Fall ist), sind an dieser Stelle in Ordnung und zum jetzigen Zeitpunkt nicht als Hindernis empfunden, sind diese Einschränkungen auch in einer Rails 4-Lösung für diese Frage in Ordnung.