Ändern Sie das Protokollformat und den Inhalt des standardmäßigen ActionController LogSubscriber in Rails 3

8

Kontext:

In einem rails 3-Projekt möchte ich (schwer) das Format und den Inhalt der Protokollzeilen "Verarbeitung" und "Abgeschlossen in" von ActionController anpassen. Dies geschieht, damit sie mit dem (auch benutzerdefinierten) Format einer älteren rails 2.3-App übereinstimmen und die Wiederverwendung verschiedener Analysetools ermöglichen. Wenn man sie zu festen Feldern macht (wo nötig mit Hilfe von Platzhaltern), ist es auch viel einfacher, Ad-hoc-Abfragen mit (sagen wir) awk zu machen oder sie ohne Smart Parsing in eine db oder Splunk zu laden.

>

Ich habe dieses Ziel schnell und schwerfertig erreicht, indem ich Schienen und Patching den LogSubscriber geflüchtet habe. aber ich schaue jetzt nach dem richtigen Weg.

Hier ist, was ich denke möchte ich tun:

  1. Erstellen Sie ein LogSubscriber erben ActionController::LogSubscriber .
  2. Überschreiben Sie nur die Methoden start_processing und process_action .
  3. Abmelden die ursprüngliche ActionController::LogSubscriber , die sich (traurigerweise) registriert, sobald die Klasse geladen wird. Dies ist der Schritt, an dem ich festhalte.
  4. Hängen Sie meinen benutzerdefinierten Abonnenten an :action_controller an, indem Sie attach_to .
  5. verwenden

Ich stelle fest, dass die Dinge einfacher wären, wenn der Protokollabonnent des Standard-ActionControllers als Konfig-Schritt konfiguriert würde und nicht beim Laden der Klasse .

Frage:

Unter der Annahme, dass der oben beschriebene Ansatz geeignet ist, wie kann ich den Standard-Log-Abonnenten abmelden oder nicht mehr anmelden ActionController::LogSubscriber ? Die Basisklasse ActiveSupport :: LogSubscriber stellt attach_to , aber keine Möglichkeit zum Trennen.

Alternativ, was ist der sauberste Weg, das Verhalten der beiden Methoden (start_processing, process_action) in der oben genannten Klasse zu ändern (oder vollständig zu unterdrücken), ActionController::LogSubscriber .

Natürlich würde ich auch jeden anderen (wartbaren) Ansatz begrüßen, der volle Freiheit bei der Anpassung des Protokollformats der beiden erwähnten Zeilen bietet.

Ungeeignete Ansätze:

  • Mein Problem kann nicht durch Hinzufügen Instrumentierung gelöst werden, wie nett dokumentiert von mnutt .
  • Ich möchte Affepatching oder Hacking auf eine Weise vermeiden, die bei der Implementierung der Rails (nicht der Schnittstelle) abbrechen kann.

Referenzen:

neillb 16.06.2011, 19:06
quelle

4 Antworten

4

Ich habe die folgende Lösung ausgearbeitet.

Ich bin nicht besonders glücklich mit Aspekten davon (zum Beispiel, das Interesse an 'process_action.action_controller' abzumelden), und ich werde sicherlich eine bessere Antwort akzeptieren.

Wir fügen Folgendes als config/initializers/custom_ac_log_subscriber.rb

hinzu %Vor%

Hinweise zum abgebrochenen ersten Ansatz:

Ich habe zunächst versucht, die Registrierung des Standard-LogSubscribers aufzuheben, mit der Absicht, dass unsere benutzerdefinierte erben und die gesamte Arbeit übernehmen würde (ohne dass sie neu erstellt werden muss).

Allerdings gibt es eine Reihe von Problemen.

1) Es reicht nicht, den LogSubscriber wie folgt zu entfernen:

%Vor%

Da die Anfrage für Benachrichtigungen registriert bleibt.

2) Wenn Sie einen LogSubscriber erben und ihn registrieren, werden alle nicht überschriebenen Methoden nicht mit der vererbten Implementierung aufgerufen.

    
neillb 16.06.2011 22:12
quelle
3

Zum Abbestellen habe ich folgende Lösung gefunden: (Rails 3.0.10):

%Vor%     
andrykonchin 20.03.2012 08:06
quelle
2

Für jeden, der danach sucht, hat Mathias Meyer eine nette Beschreibung

Außerdem hat er ein Juwel , das ein gutes Beispiel dafür sein kann, wie man bestehende Abonnenten abbestellt und eigene ersetzt. p>     

farhadf 25.09.2012 17:28
quelle
0

Wenn Sie ein Muster, das zu einer Regex passt, abbestellen möchten, können Sie dies tun:

%Vor%     
Timo Schilling 29.09.2015 14:04
quelle