Custom HandlerWrapper mit MonologBundle

8

Ich benutze Symfony 3.1 und versuche Monolog so zu konfigurieren, dass Anfragen vom Googlebot nicht protokolliert werden. Dazu habe ich ein UserAgentProcessor geschrieben, das bereits wie vorgesehen funktioniert. Im nächsten Schritt habe ich versucht, BotFilter zu schreiben, der so aussieht:

%Vor%

Dies wurde von den Kommentaren in der HandlerWrapper abstract-Klasse inspiriert (werfen Sie einen Blick auf hier ).

Nun möchte ich diesen Filter zu meiner Monolog-XML-Konfiguration hinzufügen. Ich habe versucht, es zu meinen Diensten hinzuzufügen, aber das war nicht möglich, da HandlerWrapper eine Handler-Instanz für seinen Konstruktor benötigt. Ich recherchierte, wie ich den Filter ohne einen Dienst verwenden könnte, aber soweit ich sehen kann, akzeptiert das Monologbündel nur integrierte Typen und den generischen Diensttyp.

Nun ist die Frage: Wie kann ich den Filter in meiner Konfiguration verwenden?

    
Emanuel Oster 02.09.2016, 11:27
quelle

3 Antworten

6
  

Ich benutze Symfony 3.1 und versuche Monolog so zu konfigurieren, dass Anfragen vom GoogleBot nicht protokolliert werden ...

  1. Der schnelle Weg, um zu verhindern, dass Robots Ihre Site besuchen, besteht darin, diese beiden Zeilen in die Datei /robots.txt auf Ihrem Server zu schreiben. Erstellen Sie eine robots.txt -Datei im Verzeichnis 'web' und fügen Sie den folgenden Inhalt ein:

    %Vor%
      

    Ссылка

    Dies ist die empfohlene Option, wenn Sie den Zugriff auf vollständig vermeiden müssen, damit Ihre Websites nicht länger von Suchmaschinen und anderen Bots indexiert werden. Sie müssen in Ihrer Anwendung nichts konfigurieren / implementieren, um dies zu erreichen.

  1. Nun, wenn Sie den Bot eingeben müssen, aber Sie ihn nicht in Protokollen registrieren möchten. Anstatt Protokolldateien irgendwo zu schreiben, werden einige Handler verwendet, um Protokolleinträge zu filtern oder zu ändern, bevor sie an andere Handler gesendet werden. Ein leistungsstarker integrierter Handler namens fingers_crossed wird standardmäßig in der Umgebung prod verwendet. Er speichert alle Protokollnachrichten während einer Anforderung, übergibt sie jedoch nur an einen zweiten Handler, wenn eine der Nachrichten ein action_level erreicht:

    %Vor%

    Also, in Ihrer prod.log Datei werden nur die Nachrichten / Anfragen registriert, die einen Fehler enthalten, so dass die Bots in dieser Ebene keinen Effekt haben.

    Weitere Details dazu Ссылка

  1. Was Sie zu tun versuchen, ist nicht ratsam, da der Handler von der http-Anfrage anstelle von Protokollsätzen abhängt, die nicht im Zusammenhang stehen, Sie können jedoch einen eigenen Handler in Symfony leicht:

    Lassen Sie uns die benutzerdefinierte Handler-Klasse erstellen:

    %Vor%

    Immer wenn Sie dem Logger einen Datensatz hinzufügen, durchläuft er den Handler-Stack. Jeder Handler entscheidet, ob er den Datensatz vollständig bearbeitet hat, und wenn dies der Fall ist, endet die Weitergabe des Datensatzes dort.

    Wichtig: Lesen Sie den phpdoc von den Methoden isHandling() und handle() für weitere Details.

    Als nächstes registrieren wir die Klasse als Dienst "ohne Tags":

    %Vor%

    Fügen Sie dann den -Handler zu handlers list hinzu:

    %Vor%

    Beachten Sie, dass die Eigenschaft type gleich service sein muss, id muss der Dienstname vor der Definition sein und priority muss größer sein als 0 , um sicherzustellen, dass der Handler verwendet wird wird davor jeder andere Handler ausgeführt.

    Wenn der GoogleBot eine Anfrage an die Websiteanwendung ausführt, stoppt der stopbotlog Handler alle Handler nach ihm und registriert kein Protokoll Nachricht.

    Denken Sie daran, dass dies nicht der empfohlene Weg ist! Je nach Ihren Anforderungen sollte die Implementierung von Option 1 oder 2 ausreichen.

Wenn Sie Bot-Anfragen für die Handler-Gruppe ignorieren möchten, können Sie den Container-Parameter monolog.handler.group.class überschreiben und die Gruppe handler behavior:

überschreiben %Vor%

in Ihrem config_prod.yml oder services.yml :

%Vor%

Das ist es! Jetzt können Sie Botprotokolle für die Liste der benutzerdefinierten Handles stoppen:

%Vor%

Wenn Sie Schwierigkeiten haben, Ihre Log-Dateien zu analysieren, empfehle ich Ihnen, dieses erstaunliche Tool zu verwenden: Ссылка

    
yceruto 17.09.2016, 12:17
quelle
1

Es ist ein ziemlich schmutziger Trick, aber wenn Sie es wirklich brauchen, können Sie es so machen.

Angenommen, Sie möchten einen Handler mit dem Typ stream :

umbrechen

Fügen Sie in Ihrem FilterBotsHandler einen Konstruktor hinzu:

%Vor%

Und dann definieren Sie einen Parameter monolog.handler.stream.class :

neu %Vor%

Stellen Sie sicher, dass dieser Parameter definiert wird, nachdem er von MonologBundle definiert wurde.

Das ist es. Sollte funktionieren.

    
Dmitry Malyshenko 16.09.2016 14:21
quelle
0

Sie können CompilerPass in Ihre AppBundle schreiben, die Konfigurator zu monolog service hinzufügt . Ein solcher Konfigurator kann auch ein Request Event Listener sein, der alle Handler dynamisch ersetzen kann Anfrage und Bot-Erkennung und push leeres Handler-Array auf Logger , die beim Konfigurator-Aufruf gehalten werden kann.

Mit anderen Worten, der Konfigurator wurde zu DI von CompilerPass hinzugefügt und zu EventDispatcher hinzugefügt als Listener zu Kernel Ereignisse, die onRequest check User-Agent Header sucht nach Bot und löscht dann Monolog\Logger (übergeben in Konfigurator) alle Handler (oder setzen einen NullHandler , wenn ein leeres Handler-Array fehlschlägt).

DI-Konfigurator ist nur eine Möglichkeit, Ihre Dienste während der Laufzeit zu ändern, die als Service-Definitionsebene angewendet werden kann. Eine solche Definition kann angehängt oder entfernt werden, wenn sie nicht benötigt wird, und ändert nichts an Ihrer Anwendung.

    
brzuchal 21.09.2016 19:22
quelle

Tags und Links