Zugriffsprotokoll
Das Serverzugriffsprotokoll zeichnet alle vom Server verarbeiteten Anforderungen auf. Der Speicherort und der Inhalt des Zugriffsprotokolls werden durch die CustomLog
Direktive gesteuert. DieLogFormat
Direktive kann verwendet werden, um die Auswahl des Inhalts der Protokolle zu vereinfachen. In diesem Abschnitt wird beschrieben, wie der Server für die Aufzeichnung von Informationen im Zugriffsprotokoll konfiguriert wird.
Das Speichern der Informationen im Zugriffsprotokoll ist natürlich nur der Beginn der Protokollverwaltung., Der nächste Schritt besteht darin, diese Informationen zu analysieren, um nützliche Statistiken zu erstellen. Die Protokollanalyse geht im Allgemeinen über den Rahmen dieses Dokuments hinaus und ist nicht wirklich Teil der Aufgabe des Webservers selbst. Weitere Informationen zu diesem Thema und zu Anwendungen, die eine Protokollanalyse durchführen, finden Sie im geöffneten Verzeichnis.
Verschiedene Versionen von Apache httpd haben andere Module und Direktiven verwendet, um die Zugriffsprotokollierung zu steuern, einschließlich mod_log_referer, mod_log_agent und derTransferLog
Direktive., DieCustomLog
Direktive subsumiert nun die Funktionalität aller älteren Direktiven.
Das Format des Zugriffsprotokolls ist hochgradig konfigurierbar. Das Format wird mit einer Formatzeichenfolge angegeben, die einer printf(1)-Formatzeichenfolge im C-Stil ähnelt. Einige Beispiele werden in den nächsten Abschnitten vorgestellt. Eine vollständige Liste der möglichen Inhalte der Formatzeichenfolge finden Sie unter mod_log_config
Formatzeichenfolgen.
Allgemeines Protokollformat
Eine typische Konfiguration für das Zugriffsprotokoll könnte wie folgt aussehen.,
LogFormat "%h %l %u %t \"%r\" %>s %b" commonCustomLog logs/access_log common
Dies definiert den Spitznamen common
und ordnet ihn einer bestimmten Protokollformatzeichenfolge zu. Die Formatzeichenfolge besteht aus Prozentanweisungen, von denen jede den Server anweisen, eine bestimmte Information zu protokollieren. Literalzeichen können auch in die Formatzeichenfolge eingefügt und direkt in die Protokollausgabe kopiert werden. Das Anführungszeichen ("
) muss maskiert werden, indem ein Backslash davor platziert wird, um zu verhindern, dass es als Ende der Formatzeichenfolge interpretiert wird., Die Formatzeichenfolge kann auch die Sondersteuerzeichen „\n
“ für new-line und „\t
“ für tab enthalten.
DieCustomLog
– Direktive richtet eine neue Protokolldatei mit dem definierten Spitznamen ein. Der Dateiname für das Zugriffsprotokoll ist relativ zur ServerRoot
, es sei denn, er beginnt mit einem Schrägstrich.
Die obige Konfiguration schreibt Protokolleinträge in einem Format, das als Common Log Format (CLF) bekannt ist. Dieses Standardformat kann von vielen verschiedenen Webservern erstellt und von vielen Protokollanalyseprogrammen gelesen werden., Die in CLF erzeugten Protokolldateieinträge sehen ungefähr so aus:
127.0.0.1 - frank "GET /apache_pb.gif HTTP/1.0" 200 2326
Jeder Teil dieses Protokolleintrags wird unten beschrieben.
127.0.0.1
(%h
) Dies ist die IP-Adresse des Clients (Remote-Host), der die Anforderung an den Server gestellt hat. WennHostnameLookups
aufOn
gesetzt ist, versucht der Server, den Hostnamen zu ermitteln und ihn anstelle der IP-Adresse zu protokollieren. Diese Konfiguration wird jedoch nicht empfohlen, da sie den Server erheblich verlangsamen kann., Stattdessen verwenden Sie am besten einen Protokoll-Postprozessor wielogresolve
, um die Hostnamen zu bestimmen. Die hier gemeldete IP-Adresse ist nicht unbedingt die Adresse der Maschine, an der der Benutzer sitzt. Wenn ein Proxyserver zwischen dem Benutzer und dem Server vorhanden ist, ist diese Adresse die Adresse des Proxys und nicht die Ursprungsmaschine.-
(%l
) Der“ Bindestrich “ in der Ausgabe gibt an, dass die angeforderte Information nicht verfügbar ist., In diesem Fall ist die Information, die nicht verfügbar ist, die RFC 1413-Identität des Clients, die durchidentd
auf dem Clientcomputer bestimmt wird. Diese Informationen sind äußerst unzuverlässig und sollten fast nie verwendet werden, außer in streng kontrollierten internen Netzwerken. Apache httpd versucht nicht einmal, diese Informationen zu ermitteln, es sei denn,IdentityCheck
ist aufOn
gesetzt.frank
(%u
) Dies ist die Benutzer-id der person, die das Dokument bestimmt durch HTTP-Authentifizierung., Der gleiche Wert wird normalerweise für CGI-Skripte in der UmgebungsvariablenREMOTE_USER
bereitgestellt. Wenn der Statuscode für die Anforderung (siehe unten) 401 ist, sollte dieser Wert nicht vertrauenswürdig sein, da der Benutzer noch nicht authentifiziert ist. Wenn das Dokument nicht passwortgeschützt ist, lautet dieser Teil „-
“ genau wie der vorherige.(
%t
) die Zeit, die Die Anforderung empfangen wurde., Das Format lautet:
Es ist möglich, die Zeit in einem anderen Format anzuzeigen, indem %{format}t
in der Protokollformatzeichenfolge angegeben wird, wobei format
entweder wie in strftime(3)
aus der C-Standardbibliothek oder eines der unterstützten speziellen Token ist. Für details siehe mod_log_config
format-strings.
"GET /apache_pb.gif HTTP/1.0"
(\"%r\"
) Die Anforderungszeile vom Client wird in doppelten Anführungszeichen angegeben. Die Anforderungszeile enthält viele nützliche Informationen., Erstens ist die vom Client verwendete MethodeGET
. Zweitens forderte der Client die Ressource/apache_pb.gif
an, und drittens verwendete der Client das ProtokollHTTP/1.0
. Es ist auch möglich, einen oder mehrere Teile der Anforderungszeile unabhängig voneinander zu protokollieren. Beispielsweise protokolliert die Formatzeichenfolge „%m %U%q %H
“ die Methode, den Pfad, die Abfragezeichenfolge und das Protokoll, was zu genau derselben Ausgabe wie „%r
„.200
(%>s
) Dies ist der Statuscode, den der Server an den Client zurücksendet., Diese Informationen sind sehr wertvoll, da sie zeigen, ob die Anforderung zu einer erfolgreichen Antwort (Codes, die mit 2 beginnen), einer Umleitung (Codes, die mit 3 beginnen), einem vom Client verursachten Fehler (Codes, die mit 4 beginnen) oder einem Fehler im Server geführt hat (Codes, die mit 5 beginnen). Die vollständige Liste der möglichen Statuscodes finden Sie in der HTTP-Spezifikation (RFC2616 Abschnitt 10).2326
(%b
) Der letzte Teil gibt die Größe des an den Client zurückgegebenen Objekts an, ohne die Antwortheader., Wenn kein Inhalt an den Client zurückgegeben wurde, lautet dieser Wert „-
„. Um „0
“ für keinen Inhalt zu protokollieren, verwenden Sie stattdessen%B
.
Kombiniertes Protokollformat
Eine andere häufig verwendete Formatzeichenfolge wird als kombiniertes Protokollformat bezeichnet. Es kann wie folgt verwendet werden.
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combinedCustomLog log/access_log combined
Dieses Format ist genau das gleiche wie das übliche Protokollformat, wobei zwei weitere Felder hinzugefügt werden. Jedes der zusätzlichen Felder verwendet die percent-Direktive %{header}i
, wobei der Header ein beliebiger HTTP-Anforderungsheader sein kann., Das Zugriffsprotokoll in diesem Format sieht folgendermaßen aus:
Die zusätzlichen Felder sind:
"http://www.example.com/start.html"
(\"%{Referer}i\"
) Der HTTP-Anforderungsheader „Referer“ (sic). Dies gibt die Site an, von der der Client meldet, dass er verwiesen wurde. (Dies sollte die Seite sein, die auf/apache_pb.gif
verweist oder diese enthält.)"Mozilla/4.08 (Win98; I ;Nav)"
(\"%{User-agent}i\"
) Der HTTP-Anforderungsheader des Benutzeragenten. Dies sind die identifizierenden Informationen, die der Clientbrowser über sich selbst meldet.,
Multiple Access Logs
Multiple access-logs die erstellt werden können, einfach durch Angabe von mehreren CustomLog
Direktiven in der Konfigurationsdatei. Die folgenden Anweisungen erstellen beispielsweise drei Zugriffsprotokolle. Die erste enthält die grundlegenden CLF-Informationen, während die zweite und dritte Referer-und Browserinformationen enthalten. Die letzten beiden Zeilen CustomLog
zeigen, wie die Auswirkungen der Direktiven und AgentLog
imitiert werden.,
Dieses Beispiel zeigt auch, dass es nicht notwendig ist, einen Nickname mit der Direktive LogFormat
zu definieren. Stattdessen kann das Protokollformat direkt in der Direktive CustomLog
angegeben werden.
Bedingte Protokolle
Manchmal ist es zweckmäßig, bestimmte Einträge basierend auf den Merkmalen der Clientanforderung aus den Zugriffsprotokollen auszuschließen. Dies wird leicht mit Hilfe von Umgebungsvariablen erreicht. Zunächst muss eine Umgebungsvariable festgelegt werden, um anzuzeigen, dass die Anforderung bestimmte Bedingungen erfüllt., Dies wird normalerweise mit SetEnvIf
erreicht. Dann wird dieenv=
– Klausel derCustomLog
– Direktive verwendet, um Anforderungen einzuschließen oder auszuschließen, bei denen die Umgebungsvariable festgelegt ist. Einige Beispiele:
Betrachten Sie als weiteres Beispiel die Protokollierung von Anfragen von Englischsprachigen in einer Protokolldatei und von nicht englischsprachigen in einer anderen Protokolldatei.
SetEnvIf Accept-Language "en" englishCustomLog logs/english_log common env=englishCustomLog logs/non_english_log common env=!english
In einem Caching-Szenario möchte man über die Effizienz des Caches Bescheid wissen., Eine sehr einfache Methode, um dies herauszufinden, wäre:
SetEnv CACHE_MISS 1LogFormat "%h %l %u %t "%r " %>s %b %{CACHE_MISS}e" common-cacheCustomLog logs/access_log common-cache
mod_cache
wird vor mod_env
ausgeführt und liefert den Inhalt bei Erfolg ohne. In diesem Fall protokolliert ein Cache-Treffer -
, während ein Cache-Fehler 1
protokolliert.,
Zusätzlich zurenv=
Syntax unterstütztLogFormat
Logging-Werte, die vom HTTP-Antwortcode abhängig sind:
LogFormat "%400,501{User-agent}i" browserlogLogFormat "%!200,304,302{Referer}i" refererlog
Im ersten Beispiel wird dieUser-agent
protokolliert, wenn der HTTP-Statuscode 400 oder 501 ist. In anderen Fällen wird stattdessen ein wörtliches „-“ protokolliert. Ebenso wird im zweiten Beispiel die Referer
protokolliert, wenn der HTTP-Statuscode nicht 200, 204 oder 302 ist. (Beachten Sie die „!“vor den Statuscodes.,
Obwohl wir gerade gezeigt haben, dass die bedingte Protokollierung sehr leistungsfähig und flexibel ist, ist dies nicht die einzige Möglichkeit, den Inhalt der Protokolle zu steuern. Protokolldateien sind nützlicher, wenn sie eine vollständige Aufzeichnung der Serveraktivität enthalten. Es ist oft einfacher, die Protokolldateien einfach nachzubessern, um Anfragen zu entfernen, die Sie nicht berücksichtigen möchten.