Wir möchten eine Sammlung von Controllern haben, wo wir Logger-Ausgabe von allen Aktionen und Downstream-Methoden in eine separate Protokolldatei leiten. Dies ist ein Rails 3-Projekt. In Rails 2 haben wir dies getan, indem wir die "Logger" -Methode neu definiert haben, aber in Rails 3 verwenden wir "Rails.logger". Ich habe versucht,Redirector Logger-Ausgabe für eine bestimmte Steuerung in Rails 3
Rails::logger = Logger.new(File.join(Rails.root, 'log', "reports_controller.log"), 10, 1000000)
an der Oberseite des Controllers setzen, sondern nur die spezifischen Fälle, in denen Rails.logger speziell in der Aktion verwendet wird, wird immer auf die angegebene Protokolldatei gesendet, alle Standardprotokollausgabe für den Controller leitet immer noch zur Hauptprotokolldatei.
Wie können wir die gesamte Protokollausgabe für einen bestimmten Controller in eine bestimmte Protokolldatei umleiten, um alle Standard-Controller-Ausgaben einzubeziehen?
von Standard-Controller-Ausgang, ich beziehe mich auf alle Nachrichten, die
Started POST "/api/v1/reports.json" for 10.XXX.XX.XX at 2015-03-07 01:30:22 +0000
Processing by Api::V1::ReportsController#create as JSON
Parameters: {"report"=>{"cloud_file_path"=>"report.zip", "company_id"=>nil, "created_at"=>"2015-03-07T01:30:17Z", "type_id"=>"2", "updated_at"=>"2015-03-07T01:30:17Z", "master"=>"1"}}
und alle Lügen-Ausgabe mit dem Beginn der eingehenden Anfrage starten, die von der eingehenden Anfrage und Outbound-Reaktion in der folgen könnte Controller
Grundsätzlich möchte ich alle Protokollierung für die Berichte Controller in der reports_controller.log und ich möchte keine Nachrichten für den Datenverkehr zum Berichtscontroller im Hauptprotokoll angezeigt werden (dh production.log wenn in Produktion)
Update:
Dank @ mudasobwa Hilfe mit seiner Antwort und plaudern, ich war in der Lage, dies mit Middleware als seine Antwort zeigt zu lösen (obwohl ich vor Rails :: Rack sein musste mein insert_before ändern :: Logger)
die überarbeitete Antwort von ihm, dass es für mich gelöst ist unten und es lebt in config/initializers/logger_middleware.rb
module MyApp
class LoggerMiddleware
REPORTS_API_CONTROLLER_PATH = %r|\A/api/v.*/reports/.*|
REPORTS_API_CONTROLLER_LOGFILE = "reports_controller.log"
def initialize(app)
@app, @logger = app, 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
So ist dieser Ansatz, indem Sie die Rails.Logger in der Middleware basierend Bewertung der REQUEST_URI gehen zu Auswirkungen auf alle Protokollierung ab diesem Zeitpunkt für diesen einen Anruf weiterleiten? Oder ist das nur ein zusätzlicher Ort, um mehr zu fangen? Zum Beispiel nach der anderen Antwort bemerkte ich, dass ich ActiveRecord :: Base.logger separat umleiten musste, wenn ich wollte, db Protokollierung auch geroutet. Überschreibt die Rack-Middleware den Logger für diese und andere Orte, an denen auch Logger definiert ist, oder muss ich diesen erweitern, um mehr Logger an diesem Punkt (oder weiter stromaufwärts?) Einzubeziehen? – Streamline
Die Einstellung 'Rails :: logger.instance_variable_get (: @ logger) .instance_variable_get (: @ log)' beeinflusst alles (ich benutze dies in der Produktion). Das Einstellen von 'Rails :: logger' hängt von etwas ab, in das ich nicht vertieft bin (Kurz gesagt: Ich schlage vor, den zugrunde liegenden 'Logger' zu setzen.) – mudasobwa
Wenn Sie sagen, dass Rails :: logger.instance_variable_get (: @ logger) .instance_variable_get (: @ log) jetzt in Produktion ist, tun Sie das in der gleichen wie Sie über die Middleware gepostet haben und diese Zeile nur ersetzen, wenn% r | \ A/api/v1/| dann Rails :: logger = @ my_logger' oben mit diesem 'wenn% r | \ A/api/v1/| dann Rails :: logger.instance_variable_get (: @ logger) .instance_variable_set (: @ log, @ my_logger) '? – Streamline