2010-10-29 25 views
7

Poszukuję deseru deseniu regex dla String w HttpLogFormat. Dziennik jest generowany przez haproxy. Poniżej znajduje się przykładowy ciąg w tym formacie.Wzór Regex do parsowania formatu HttpLog

Feb 6 12:14:14 localhost haproxy[14389]: 10.0.1.2:33317 [06/Feb/2009:12:14:14.655] http-in static/srv1 10/0/30/69/109 200 2750 - - ---- 1/1/1/1/0 0/0 {1wt.eu} {} "GET /index.html HTTP/1.1" 

Objaśnienie formatu jest dostępne pod adresem HttpLogFormat. Każda pomoc jest doceniana.

Próbuję uzyskać poszczególne informacje zawarte w tej linii. Oto pola:

  1. process_name '[' pid ']:'
  2. client_ip ':' client_port
  3. '[' accept_date ']'
  4. frontend_name
  5. backend_name '/' nazwa_serwera
  6. Tq '/' Tw '/' Tc '/' Tr '/' Tt *
  7. status_code
  8. bytes_read
  9. captured_request_cookie
  10. captured_response_cookie
  11. termination_state
  12. actconn '/' feconn '/' beconn '/' srv_conn '/' ponawia
  13. srv_queue '/' backend_queue
  14. '{' captured_request_headers * '}'
  15. '{' captured_response_headers * '}'
  16. ' "' http_request '"'
+1

Co próbujesz przeanalizować z tej linii? Jedną rzeczą jest to, aby dopasować go, to jest kolejna rzecz, aby uzyskać konkretne informacje z niego. – eldarerathis

+0

Ale co chcesz uzyskać z linii? – Keng

+1

To naprawdę zależy od tego, co chcesz dopasować. Wszystkie informacje lub tylko ich część? – jordanbtucker

Odpowiedz

4

Regex:

^(\w+ \d+ \S+) (\S+) (\S+)\[(\d+)\]: (\S+):(\d+) \[(\S+)\] (\S+) (\S+)/(\S+) (\S+) (\S+) (\S+) *(\S+) (\S+) (\S+) (\S+) (\S+) \{([^}]*)\} \{([^}]*)\} "(\S+) ([^"]+) (\S+)" *$ 

Wyniki:

Group 1: Feb 6 12:14:14 
Group 2: localhost 
Group 3: haproxy 
Group 4: 14389 
Group 5: 10.0.1.2 
Group 6: 33317 
Group 7: 06/Feb/2009:12:14:14.655 
Group 8: http-in 
Group 9: static 
Group 10: srv1 
Group 11: 10/0/30/69/109 
Group 12: 200 
Group 13: 2750 
Group 14: - 
Group 15: - 
Group 16: ---- 
Group 17: 1/1/1/1/0 
Group 18: 0/0 
Group 19: 1wt.eu 
Group 20: 
Group 21: GET 
Group 22: /index.html 
Group 23: HTTP/1.1 

używam RegexBuddy do komponowania złożonych wyrażeń regularnych.

+0

Dzięki ... to zadziałało całkiem dobrze. po prostu potrzebowałem kilku poprawek do obsługi niestandardowych scenariuszy. – Thimmayya

1

To wygląda na bardzo skomplikowany ciąg, który można dopasować. Polecam używanie narzędzia takiego jak Expresso. Zacznij od ciągu, który próbujesz dopasować, a następnie zacznij zastępować jego fragmenty notacją Regex.

Aby pobrać pojedyncze elementy, użyj grupowania nawiasów.

Inną opcją byłoby wykonanie wyrażeń regularnych dla każdego kawałka, który próbujesz pobrać.

2

Use at your own peril.

Zakłada się, że wszystkie pola zwracają coś, co jest, z wyjątkiem tych, które zostały oznaczone gwiazdkami (czy to oznacza gwiazdka)? Istnieją również oczywiste przypadki awarii, takie jak wszelkiego rodzaju zagnieżdżone nawiasy, ale jeśli rejestrator drukuje rozsądnie rozsądne wiadomości, to domyślam się, że wszystko będzie dobrze ...

Oczywiście, nawet ja osobiście nie chciałbym mieć aby to utrzymać, ale masz to. Możesz rozważyć napisanie zwykłego "parsera" zamiast tego, jeśli możesz.

Edytuj: Oznaczono to jako CW, ponieważ jest to bardziej "Zastanawiam się, jak to się stanie", niż jakakolwiek inna odpowiedź.Do szybkiego odniesienia, to jest to, co skończyło się na budowie w rubular:

^[^[]+\s+(\w+)\[(\d+)\]:([^:]+):(\d+)\s+\[([^\]]+)\]\s+[^\s]+\s+(\w+)\/(\w+)\s+(\d+)\/(\d+)\/(\d+)\/(\d+)\/(\d*)\s+(\d+)\s+(\d+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s(\d+)\/(\d+)\/(\d+)\/(\d+)\/(\d+)\s+(\d+)\/(\d+)\s+\{([^}]*)\}\s\{([^}]*)\}\s+\"([^"]+)\"$ 

Mój pierwszy język programowania był Perl, a nawet jestem skłonny przyznać, że jestem przerażona tym.

+0

+1 tylko za stawianie tej paskudnej rzeczy! Wypróbuję to i zaktualizuję, jak to działa. – Thimmayya

+0

Dzięki za rozwiązanie. Działa to w większości przypadków. Powyższe rozwiązanie Mike'a działa lepiej, a regex jest prostszy i bardziej elastyczny. Użyłem rubularu, aby poprawić regex i jest to dobre narzędzie. – Thimmayya

0

Nie sądzę regex jest najlepszym rozwiązaniem tutaj ... jednak, jeśli to twoja opcja TYLKO ...

Spróbuj poszukać w tych opcji zamiast. https://serverfault.com/q/62687/438

+0

Jakie inne opcje proponujesz? – Thimmayya

+0

@Thimmayya Myślę, że Splunk byłby na szczycie mojej listy. http://www.splunk.com/ – Keng

1

Dlaczego próbujesz dokładnie dopasować linię do linii? Jeśli szukasz konkretnych pól w nim, lepiej określić, które z nich i wyodrębnić je. Jeśli chcesz uruchamiać statystykę w dziennikach haproxy, powinieneś spojrzeć na narzędzie "halog" w katalogu "contrib" w źródłach. Weź ten z wersji 1.4.9, wie nawet, jak sortować adresy URL według czasu odpowiedzi.

Ale cokolwiek chcesz zrobić z tymi liniami, regex będzie prawdopodobnie zawsze najwolniejszym i najbardziej złożonym rozwiązaniem.

Powiązane problemy