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 [url=http://forum.dug.net.pl/viewtopic.php?id=22977]przykład[/url] parsowania loga Snorta, wystarczy zrobić uchwyt pliku dla pliku logu - żeby skrypt go czytał, funkcję warunkową [b]if $regex =~/wartość/ then {akcja do wykonania}[/b], i gotowe.
A tu przykład innego [url=http://jacekalex.sh.dug.net.pl/rssperl]skrypta[/url], 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
Time (s) | Query |
---|---|
0.00010 | SET CHARSET latin2 |
0.00003 | SET NAMES latin2 |
0.00120 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.136.236.178' WHERE u.id=1 |
0.00063 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.136.236.178', 1732287320) |
0.00041 | SELECT * FROM punbb_online WHERE logged<1732287020 |
0.00052 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=26370 AND t.moved_to IS NULL |
0.00006 | SELECT search_for, replace_with FROM punbb_censoring |
0.00151 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=26370 ORDER BY p.id LIMIT 0,25 |
0.00072 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=26370 |
Total query time: 0.00518 s |