Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam
Szukam prostego skryptu, który na żywo będzie analizował powiedzmy plik /var/log/aplikacja.log i jeśli tylko pojawi się w nim słowo "error" wykona polecenie killall aplikacja. Googlowałem, próbowałem samodzielnie coś skleić z while i tail -f /var/log/aplikacja.log ale nic mi nie wychodziło.
Z góry dzięki za pomoc
Offline
Failban? jest od tego między innymi.
Skrypcio?
Ja bym raczej próbował w Perlu, jest bardziej elastyczny pod względem np regexu.
Offline
a to musi być koniecznie bash? bo mam parę takich domorosłych skryptów, ale w pythonie...
btw. a aplikacja to się sama nie może grzecznie skończyć jak ma errora?
Offline
Niestety aplikacja nie moja ani nie mam dostepu do kodu źrodlowego.
o fail2ban slyszalem ale tylko ze potrafi analizowac logi papache'a i zakladac regulki w iptables. O ile przed chwila przeczytalem, ze mozna mu wbic dowolnego regexpa to nie wiem, jak ustawic mu akcje jak ma wykonywac czyli amiast iptables xxx killall aplikacja.
Moze byc i python. Pewnie w jednym jak i drugim jezyku ten skrypt nie zajmie wiecej niz kilka linijek
Offline
Python:
#!/usr/bin/env python import sys while True: a=sys.stdin.readline() if !a: break if 'error' in a: akcja()
gdzie zamiast "akcja()" możesz zrobić sobie cokolwiek, np. (importując subprocess):
subprocess.call(["killall","aplikacja"])
W bashu masz do tego jedną linijkę:
tail -F /var/log/aplikacja.log | python moj_program.py
Może być?
Offline
Perl
Tu masz przykład parsowania loga Snorta, wystarczy zrobić uchwyt pliku dla pliku logu - żeby skrypt go czytał, funkcję warunkową if $regex =~/wartość/ then {akcja do wykonania}, i gotowe.
A tu przykład innego skrypta, gdzie ładnie widać akcje warunkowe.
Pozdro
;-)
Offline
jednak zamiast uchwytu do pliku wolę follow name - rozwiązanie sprawdzone i odporne na logrotate.
Offline
To rozwiazanie ze stdout pałeczką jest dla mnie idealne bo tak naprawdę plik /var/log/aplikacja.log tworze ja właśnie zapisujac tam stdout :) Spróbowałem uruchomić skrypt ale dostaję Syntax error przy !a: Proszę o pomoc bo nie znam Pythona totalnie.
Offline
przepraszam najmocniej ale to przed kawą było.
if not a:
i jeszcze jeśli chcesz użyć subprocess:
import sys, subprocess
(to już znajdziesz gdzie masz podmienić)
Ostatnio edytowany przez ethanak (2014-09-08 11:42:29)
Offline
Dzięki, to jest to co potrzebowałem, browar.
Jeszcze tylko pytanie jak zmodyfikować ten warunek, jeżeli w stdout pojawia się 'ERROR' jak i 'error' (oba stanowią tylko fragment stringa) ?
Ostatnio edytowany przez DeWu (2014-09-08 15:14:32)
Offline
np.
if 'error' in a.lower():
Przy czymś bardziej skomplikowanym trzeba się bawić w regexpy, np.:
if re.search(r'\berror\b',a,re.I):
uprzednio dodając 're' do importu, czyli:
import sys, subprocess, re
we właściwym miejscu - znajdzie napis 'error' niezależnie od wielkości znaków, ale tylko jeśli stanowi pełne słowo.
Ostatnio edytowany przez ethanak (2014-09-09 09:35:20)
Offline
Strony: 1