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:
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?
Ich benutze Symfony 3.1 und versuche Monolog so zu konfigurieren, dass Anfragen vom GoogleBot nicht protokolliert werden ...
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:
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.
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:
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 Ссылка
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
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:
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:
in Ihrem config_prod.yml
oder services.yml
:
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: Ссылка
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
:
Fügen Sie in Ihrem FilterBotsHandler einen Konstruktor hinzu:
%Vor% Und dann definieren Sie einen Parameter monolog.handler.stream.class
:
Stellen Sie sicher, dass dieser Parameter definiert wird, nachdem er von MonologBundle definiert wurde.
Das ist es. Sollte funktionieren.
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.