Mogę używać analizatorów dzienników, ale często muszę analizować ostatnie dzienniki sieciowe, aby zobaczyć, co się w tej chwili dzieje.
Czasami robię takie rzeczy, jak znaleźć 10 najlepszych IPS, które żądają określonego pliku
cat foo.log | grep request_to_file_foo | awk '{print $1}' | sort -n | uniq -c | sort -rn | head
Co masz w swoim zestawie narzędzi?
Odpowiedzi:
Możesz zrobić prawie wszystko z plikami dziennika apache z samym awk. Pliki dziennika Apache są zasadniczo oddzielone białymi spacjami i możesz udawać, że cytaty nie istnieją, i uzyskać dostęp do wszelkich informacji, którymi jesteś zainteresowany, według numeru kolumny. Jedyny czas, kiedy to się psuje, to jeśli masz połączony format dziennika i interesujesz się klientami użytkownika, w którym to momencie musisz użyć cudzysłowu (") jako separatora i uruchomić osobną komendę awk. Poniższe informacje pokazują adresy IP każdy użytkownik, który żąda strony indeksu posortowanej według liczby trafień:
Żądany adres URL to 7 USD. Możesz dodać dowolne warunki na początku. Zamień „7 $ ==” / ”na dowolne potrzebne informacje.
Jeśli zastąpisz 1 $ w (ipcount [$ 1] ++), możesz pogrupować wyniki według innych kryteriów. Użycie 7 USD pokaże, które strony były odwiedzane i jak często. Oczywiście wtedy chciałbyś zmienić stan na początku. Poniżej pokazano, które strony były dostępne dla użytkownika z określonego adresu IP:
Możesz również potokować dane wyjściowe przez sortowanie, aby uporządkować wyniki, albo jako część polecenia powłoki, albo również w samym skrypcie awk:
To drugie byłoby przydatne, jeśli zdecydujesz się rozwinąć skrypt awk, aby wydrukować inne informacje. Wszystko zależy od tego, czego chcesz się dowiedzieć. Powinny one służyć jako punkt wyjścia do wszystkiego, co Cię interesuje.
źródło
Jedną z rzeczy, których nigdy nie widziałem, z powodów, których nie wyobrażam sobie, jest zmiana formatu pliku dziennika Apache na łatwiejszą do analizy wersję z informacjami, które są dla Ciebie ważne.
Na przykład nigdy nie używamy podstawowego uwierzytelniania HTTP, więc nie musimy rejestrować tych pól. Ja jestem ciekaw, jak długo każde żądanie zajmuje służyć, więc dodamy, że w. W jednym projekcie, chcemy też wiedzieć (na naszej równoważenia obciążenia) czy jakieś serwery służą żądania wolniej niż inni, więc zalogować nazwę serwera, do którego jesteśmy z powrotem proxy.
Oto fragment konfiguracji apache jednego serwera:
Nie można tak naprawdę powiedzieć, że między każdym polem znajduje się dosłowny znak tabulacji (\ t). Oznacza to, że jeśli chcę przeprowadzić analizę w Pythonie, być może pokażę na przykład statusy inne niż 200, mogę to zrobić:
Lub gdybym chciał zrobić „kto łączy obrazy na gorąco”? to byłby
W przypadku adresów IP w dzienniku dostępu poprzedni przykład:
staje się mniej więcej tak:
Łatwiejszy do odczytania i zrozumienia oraz znacznie mniej kosztowny obliczeniowo (bez wyrażenia regularnego), co w przypadku dzienników o pojemności 9 GB ma ogromną różnicę w zakresie czasu. Kiedy robi się to NAPRAWDĘ fajnie, jeśli chcesz zrobić to samo dla agentów użytkownika. Jeśli twoje dzienniki są rozdzielane spacjami, musisz ręcznie dopasować wyrażenie regularne lub wyszukać ciąg znaków. W tym formacie jest to proste:
Dokładnie tak samo jak powyżej. W rzeczywistości każde podsumowanie, które chcesz zrobić, jest dokładnie takie samo.
Dlaczego, u licha, miałbym spędzać procesor mojego systemu na awk i grep, kiedy cięcie zrobi dokładnie to, czego chcę rzędów wielkości szybciej?
źródło
cut -f 3 log | uniq -c | sort -n
agentami użytkownikówcut -f 8 log | uniq -c | sort -n
.Zapomnij o awk i grep. Sprawdź asql . Po co pisać nieczytelne skrypty, skoro można użyć składni podobnej do języka SQL do przeszukiwania pliku dziennika. Na przykład.
źródło
Oto skrypt do wyszukiwania najlepszych adresów URL, najlepszych stron odsyłających i najlepszych użytkowników z ostatnich N wpisów w dzienniku
Źródło
źródło
dla adresów IP w dzienniku dostępu:
To trochę brzydkie, ale działa. Korzystam także z netstat (aby zobaczyć aktywne połączenia):
To jedne z moich ulubionych „one linerów” :)
źródło
Stworzenie listy typowych pytań byłoby świetnym indeksem dla tych odpowiedzi na to pytanie. Moje typowe pytania to:
Zauważyłem takie zmiany, monitorując strony statusu serwera (przez mod_status) pod kątem szybkości transmisji i przybliżonego czasu odpowiedzi dla aktywnych i ostatnio zakończonych żądań (wiedząc, że brakuje mi ogromnej ilości danych, ale próbki są wystarczająco dobre).
Korzystam z następującej dyrektywy LogFormat (% T jest naprawdę przydatny)
Szukam przyczyny i tego, co stało się najpierw ... zwykle na temat określonych podzbiorów wzorców w moich logach, więc muszę znać następujące informacje dla każdego wzorca / wyrażenia regularnego:
Zwykle używam perla, ponieważ w końcu staje się wystarczająco skomplikowany, aby był opłacalny.
Przykładem innym niż Perl byłby szybki przepływ danych na minutę dla kodów stanu innych niż 200:
Tak, oszukuję tym grepem, zakładając, że cytat-spacja-200-spacja pasuje tylko do kodów stanu HTTP .... może użyć awk lub perl do izolacji pola, pamiętaj, że może to być niedokładne.
Bardziej złożonym przykładem w Perlu może być wizualizacja zmiany szybkości transmisji dla wzorca.
W skrypcie poniżej jest wiele do żucia, zwłaszcza jeśli nie znasz perla.
następujący kod:
Jeśli chcesz po prostu przetworzyć standardowe dane, sprawdź
źródło
Tutaj mój przykład „sed” odczytuje domyślny format dzienników Apache i konwertuje go na coś wygodniejszego do automatycznego przetwarzania. Cała linia jest zdefiniowana jako wyrażenie regularne, zmienne są zapisywane i zapisywane na wyjściu z „#” jako separatorem.
Uproszczony zapis danych wejściowych jest następujący:% s% s% s [% s] "% s"% s% s "% s" "% s"
Przykładowy wiersz wejściowy: xx.xx.xx.xx - - [29 / Mar / 2011: 12: 33: 02 +0200] „GET /index.html HTTP / 1.0” 200 9443 ”-„ „Mozilla / 4.0”
Przykładowa linia wyjściowa: xx.xx.xx.xx # - # - # 29 / Mar / 2011: 12: 33: 02 + 0200 # GET /index.html HTTP / 1.0 # 200 # 9443 # - # Mozilla / 4.0
Poczuj moc wyrażeń regularnych :-)
źródło
Często używam awk, modyfikując lub cat'ując plik. Każdej nocy dostarczam sobie raport internetowy dla każdego serwera. W zależności od pliku dziennika i LogFormat będziesz musiał edytować niektóre linijki, które będą dla Ciebie działać.
Oto prosty przykład:
Jeśli chcę dostosować dzienniki na moim serwerze tylko dla kodów stanu 404/500, zrobiłbym to:
<snip>
</ snip>
źródło
Kto łączy Twoje zdjęcia na gorąco:
źródło
Rzeczą, którą zwykle robię, jest czytanie sekcji dziennika na podstawie czasu, więc napisałem następujący skrypt za pomocą sed, aby wyciągnąć okres, który mnie interesuje, działa na każdym pliku dziennika, do którego przyszedłem w poprzek i może również obsługiwać zarchiwizowane dzienniki.
źródło
Chociaż nie jestem sedem ani awk, są dwie rzeczy, które uważam za przydatne do obsługi plików dziennika apache i icecast.
AWStats ma bardzo przydatny skrypt o nazwie logresolvemerge.pl, który będzie łączyć wiele skompresowanych lub nieskompresowanych plików dziennika, usuwać duplikaty i sortować według datownika. Może także wyszukiwać DNS i być skonfigurowany do uruchamiania wielowątkowego. Jest to szczególnie przydatne podczas korzystania z awstats, ponieważ awstats nie może dodawać wierszy dziennika ze znacznikami czasu starszymi niż bieżąca baza danych, więc wszystkie muszą być dodawane w kolejności, ale to bardzo proste, ponieważ po prostu cucasz wszystko na logresolvemerge.pl i wszystko ładnie wyskakuje.
sed i awk są dość kiepskie w obchodzeniu się z datami, ponieważ ogólnie traktują je jak łańcuchy. awk ma pewne funkcje związane z czasem i datą, ale nie są zbyt duże. Na przykład wyodrębnienie zakresu linii między dwoma znacznikami czasu jest trudne, jeśli te dokładne znaczniki czasu nie występują w pliku (nawet jeśli wartości między nimi) - przykład Chrisa ma właśnie ten problem. Aby temu zaradzić, napisałem skrypt PHP, który zgłasza zakresy znaczników czasu pliku dziennika, a także może wyodrębnić porcję według zakresu znaczników czasu, używając dowolnego formatu daty lub godziny (nie musi być zgodny z formatem znacznika czasu pliku dziennika).
Aby zachować ten temat, oto kilka przydatnych awkism: Pobierz całkowitą liczbę bajtów obsługiwanych z dziennika apache lub icecast:
Uzyskaj całkowitą liczbę sekund połączonych z dziennika Icecast:
źródło
Odzyskiwanie tego starego wątku, po rezygnacji z asql dla dużych plików dziennika, szukałem rozwiązania againg, również w przypadku awarii serwera, znalazłem tutaj o wtopie , jest to narzędzie typu open source, które może wykonywać monitorowanie na żywo lub dzienniki procesów i uzyskiwać statystyki (na górę N), bardzo elastyczny i potężny, oficjalne miejsce jest tutaj
źródło