dziennik dostępu
dziennik dostępu do serwera rejestruje wszystkie żądania przetwarzane przez serwer. Lokalizacja i zawartość dziennika dostępu są kontrolowane przez dyrektywę CustomLog
. Dyrektywa LogFormat
może być użyta do uproszczenia wyboru zawartości dzienników. W tej sekcji opisano, jak skonfigurować serwer do rejestrowania informacji w dzienniku dostępu.
oczywiście zapisywanie informacji w dzienniku dostępu to dopiero początek zarządzania logami., Następnym krokiem jest analiza tych informacji w celu stworzenia użytecznych statystyk. Analiza logów w ogóle wykracza poza zakres tego dokumentu i tak naprawdę nie jest częścią pracy samego serwera www. Aby uzyskać więcej informacji na ten temat, oraz dla aplikacji, które wykonują analizę logów, sprawdź Open Directory.
różne wersje Apache httpd używały innych modułów i dyrektyw do kontrolowania rejestrowania dostępu, w tym mod_log_referer, mod_log_agent i dyrektywyTransferLog
., Dyrektywa CustomLog
zastępuje obecnie funkcjonalność wszystkich starszych dyrektyw.
format dziennika dostępu jest wysoce konfigurowalny. Format jest określony za pomocą ciągu znaków, który wygląda podobnie do ciągu znaków formatu printf(1) W Stylu C. Niektóre przykłady przedstawiono w następnych sekcjach. Aby uzyskać pełną listę możliwej zawartości ciągu formatującego, zobacz mod_log_config
ciągi formatujące.
wspólny format dziennika
typowa konfiguracja dziennika dostępu może wyglądać następująco.,
LogFormat "%h %l %u %t \"%r\" %>s %b" commonCustomLog logs/access_log common
definiuje Nickcommon
I kojarzy go z określonym łańcuchem formatu dziennika. Łańcuch formatowania składa się z dyrektyw procentowych, z których każda nakazuje serwerowi zapisanie określonej informacji. Literalne znaki mogą być również umieszczone w łańcuchu formatowania i zostaną skopiowane bezpośrednio do wyjścia dziennika. Znak cudzysłowu ("
) musi być zabezpieczony przez umieszczenie przed nim odwrotnego ukośnika, aby zapobiec jego interpretacji jako końca ciągu formatu., Łańcuch formatowania może również zawierać specjalne znaki sterujące „\n
„dla nowej linii i” \t
” dla tab.
dyrektywaCustomLog
ustawia nowy plik dziennika przy użyciu zdefiniowanego pseudonimu. Nazwa pliku dziennika dostępu jest względna do ServerRoot
, chyba że zaczyna się ukośnikiem.
powyższa konfiguracja będzie zapisywać wpisy dziennika w formacie znanym jako Common Log Format (CLF). Ten standardowy format może być produkowany przez wiele różnych serwerów internetowych i odczytywany przez wiele programów do analizy logów., Wpisy pliku dziennika utworzone w CLF będą wyglądały mniej więcej tak:
127.0.0.1 - frank "GET /apache_pb.gif HTTP/1.0" 200 2326
każda część tego wpisu jest opisana poniżej.
127.0.0.1
(%h
) jest to adres IP klienta (zdalnego hosta), który złożył żądanie do serwera. JeśliHostnameLookups
jest ustawione naOn
, to serwer spróbuje określić nazwę hosta i zalogować ją zamiast adresu IP. Jednak ta konfiguracja nie jest zalecana, ponieważ może znacznie spowolnić działanie serwera., Zamiast tego najlepiej jest użyć post-procesora dziennika, takiego jaklogresolve
, aby określić nazwy hostów. Podany tutaj adres IP niekoniecznie jest adresem maszyny, na której siedzi użytkownik. Jeśli pomiędzy Użytkownikiem a serwerem istnieje serwer proxy, adres ten będzie adresem serwera proxy, a nie maszyny, z której pochodzi.-
(%l
)” myślnik ” na wyjściu oznacza, że Żądana informacja nie jest dostępna., W tym przypadku informacja, która nie jest dostępna, to tożsamość klienta RFC 1413 określona przezidentd
na komputerze klienta. Informacje te są wysoce niewiarygodne i prawie nigdy nie powinny być używane z wyjątkiem ściśle kontrolowanych sieci wewnętrznych. Apache httpd nie będzie nawet próbował określić tych informacji, chyba żeIdentityCheck
jest ustawione naOn
.frank
(%u
) jest to identyfikator użytkownika osoby żądającej dokumentu określony przez uwierzytelnianie HTTP., Ta sama wartość jest zazwyczaj dostarczana skryptom CGI w zmiennej środowiskowejREMOTE_USER
. Jeśli kod stanu dla żądania (patrz poniżej) to 401, to ta wartość nie powinna być zaufana, ponieważ użytkownik nie jest jeszcze uwierzytelniony. Jeśli dokument nie jest chroniony hasłem, ta część będzie „-
” tak jak poprzednia.(
%t
) czas otrzymania żądania., Format to:
Możliwe jest wyświetlenie czasu w innym formacie przez podanie %{format}t
w łańcuchu formatu dziennika, gdzie format
jest albo taki jak w strftime(3)
z biblioteki standardowej C, albo jednego z obsługiwanych specjalnych tokenów. Szczegółowe informacje można znaleźć w ciągach formatującychmod_log_config
.
"GET /apache_pb.gif HTTP/1.0"
(\"%r\"
) linia żądania klienta jest podana w podwójnych cudzysłowach. Wiersz request zawiera wiele przydatnych informacji., Po pierwsze, metoda używana przez Klienta toGET
. Po drugie, klient zażądał zasobu/apache_pb.gif
, a po trzecie, klient użył protokołuHTTP/1.0
. Możliwe jest również samodzielne logowanie jednej lub kilku części linii żądania. Na przykład łańcuch formatowania „%m %U%q %H
„zarejestruje metodę, ścieżkę, łańcuch zapytania i protokół, dając dokładnie taki sam wynik jak”%r
„.200
(%>s
) jest to kod stanu, który serwer wysyła z powrotem do klienta., Ta informacja jest bardzo cenna, ponieważ ujawnia, czy żądanie spowodowało pomyślną odpowiedź (kody rozpoczynające się od 2), przekierowanie (kody zaczynające się od 3), błąd spowodowany przez Klienta (kody zaczynające się od 4), czy błąd na serwerze (kody zaczynające się od 5). Pełna lista możliwych kodów stanu znajduje się w specyfikacji HTTP (RFC2616 sekcja 10).2326
(%b
) ostatnia część wskazuje rozmiar obiektu zwróconego do klienta, nie włączając nagłówków odpowiedzi., Jeśli żadna zawartość nie została zwrócona do klienta, wartością będzie „-
„. Aby zalogować się „0
„dla braku zawartości, użyj zamiast tego%B
.
Combined Log Format
innym powszechnie używanym ciągiem formatów jest nazywany Combined Log Format. Może być stosowany w następujący sposób.
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combinedCustomLog log/access_log combined
ten format jest dokładnie taki sam jak zwykły format dziennika, z dodaniem dwóch dodatkowych pól. Każde z dodatkowych pól wykorzystuje dyrektywę procentową %{header}i
, gdzie nagłówkiem może być dowolny nagłówek żądania HTTP., Dziennik dostępu w tym formacie będzie wyglądał następująco:
dodatkowe pola to:
"http://www.example.com/start.html"
(\"%{Referer}i\"
) nagłówek żądania HTTP „Referer” (sic). Daje to witrynę, z której klient zgłasza, że został odesłany. (Powinna to być strona, która łączy się lub zawiera/apache_pb.gif
)."Mozilla/4.08 (Win98; I ;Nav)"
(\"%{User-agent}i\"
) nagłówek żądania HTTP User-Agent. Są to informacje identyfikujące, które przeglądarka klienta zgłasza o sobie.,
dzienniki wielokrotnego dostępu
dzienniki wielokrotnego dostępu mogą być tworzone po prostu przez podanie wielu dyrektyw CustomLog
w pliku konfiguracyjnym. Na przykład następujące dyrektywy utworzą trzy dzienniki dostępu. Pierwsza zawiera podstawowe informacje o CLF, podczas gdy druga i trzecia zawierają informacje o refererze i przeglądarce. Dwie ostatnie linieCustomLog
pokazują, jak naśladować efekty dyrektywReferLog
IAgentLog
.,
Ten przykład pokazuje również, że nie jest konieczne definiowanie pseudonimu za pomocą dyrektywy LogFormat
. Zamiast tego format dziennika może być określony bezpośrednio w dyrektywie CustomLog
.
Logi warunkowe
zdarzają się sytuacje, w których wygodne jest wykluczenie pewnych wpisów z logów dostępu na podstawie charakterystyki żądania klienta. Można to łatwo osiągnąć za pomocą zmiennych środowiskowych. Po pierwsze, zmienna środowiskowa musi być ustawiona tak, aby wskazywała, że żądanie spełnia określone warunki., Jest to zwykle realizowane za pomocą SetEnvIf
. Następnieenv=
klauzula dyrektywyCustomLog
jest używana do włączania lub wyłączania żądań, w których ustawiona jest zmienna środowiskowa. Niektóre przykłady:
jako kolejny przykład rozważmy rejestrowanie żądań od osób mówiących po angielsku do jednego pliku dziennika, a nie-osób mówiących po angielsku do innego pliku dziennika.
SetEnvIf Accept-Language "en" englishCustomLog logs/english_log common env=englishCustomLog logs/non_english_log common env=!english
w scenariuszu buforowania warto wiedzieć o wydajności bufora., Bardzo prostą metodą jest:
SetEnv CACHE_MISS 1LogFormat "%h %l %u %t "%r " %>s %b %{CACHE_MISS}e" common-cacheCustomLog logs/access_log common-cache
mod_cache
uruchomi się przed mod_env
I, gdy zakończy się sukcesem, dostarczy zawartość bez niej. W takim przypadku Cache hit zarejestruje -
, podczas gdy Cache miss zarejestruje 1
.,
oprócz składni env=
, LogFormat
obsługuje rejestrowanie wartości uwarunkowanych kodem odpowiedzi HTTP:
LogFormat "%400,501{User-agent}i" browserlogLogFormat "%!200,304,302{Referer}i" refererlog
w pierwszym przykładzie User-agent
będzie być zalogowany, jeśli kod statusu HTTP to 400 lub 501. W innych przypadkach zapisywane jest literalne” -„. Podobnie, w drugim przykładzie,Referer
zostanie zalogowany, jeśli kod statusu HTTP nie jest 200, 204 lub 302. (Uwaga „!”przed kodami statusu.,
chociaż właśnie pokazaliśmy, że logowanie warunkowe jest bardzo wydajne i elastyczne, nie jest to jedyny sposób na kontrolowanie zawartości dzienników. Pliki dziennika są bardziej przydatne, gdy zawierają pełny zapis aktywności serwera. Często łatwiej jest po prostu przetworzyć pliki dziennika w celu usunięcia żądań, których nie chcesz brać pod uwagę.