Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

[Narzędzia] logdetect - monitorowanie logów w czasie rzeczywistym

Witam.

W ramach zdobywania doświadczenia i poszerzania swojej wiedzy z zakresu programowania rozwijam różne swoje projekty, o tym już pisałem jakiś czas temu.
Tak więc tym razem przedstawiam Wam projekt logdetect napisany w języku Python. Aktualna wersja jest w fazie alpha więc nie radzę używać tego na serwerze produkcyjnym ;-)

Strona projektu: https://github.com/webnull/logdetectPaczki: (obecnie niedostępne)

Jak działa logdetect

Głównym zadaniem aplikacji jest monitorowanie zmian w plikach i przepuszczanie ich przez filtr który zależnie od wyniku dopasowania podejmie określone działanie.

Poprzez podjęcie działania można rozumieć dowolną czynność, a przykładowo może to być zbanowanie użytkownika, powiadomienie administratora, wyłączenie serwera, czy po prostu uruchomienie programu X.

Logdetect od środka

Działanie programu to główna pętla w której mamy ustalony w konfiguracji odstęp czasowy pomiędzy sprawdzaniem zdarzeń, może to być 500 ms, 1 sec, 60 minut, różnie - po prostu częstotliwość sprawdzania samej daty modyfikacji wszystkich plików.

Jeśli data modyfikacji różni się od poprzedniego sprawdzenia to znaczy, że plik został zmieniony - w takim razie trzeba ruszać na przód, tutaj jest kolejny krok.

Skoro zaszły jakieś zmiany to trzeba sprawdzić co dokładnie - a możliwe jest to do wykonania poprzez zapisywanie swojej pozycji w pliku, a następnie wracanie do niej przy następnym sprawdzaniu.

Kolejnym etapem jest parsowanie każdej linii przez wtyczkę do tego przeznaczoną, używa ona odpowiednich filtrów które pozwolą wyodrębnić interesujące nas dane.

W zależności od dopasowania może zostać podjęta akcja, ale z tym nie należy się śpieszyć, bo najpierw można przyznać użytkownikowi punkty ostrzeżeń. Dopiero po przekroczeniu ustalonego limitu punktów może zostać podjęta akcja. Można także zrezygnować z tej funkcji ustawiając wymaganą ilość punktów na "immediately".

Czyż to nie wynajdowywanie koła od nowa?

Pisanie tego typu aplikacji w wolnym czasie to dla mnie spore doświadczenie, lubię to robić oraz udostępniać. Myślę, że warto mieć pod ręką tą trzecią alternatywę, kto wie - być może akurat moja aplikacja będzie komuś bardziej pasować od tych popularnych, powszechnie stosowanych. Myślę, że na razie musi tylko wyjść z faz testowych, ale to nie tak prędko nastanie.

Ozdabianie koła

Staram się tak jak to możliwe implementować funkcje które są niedostępne w alternatywnych aplikacjach tego typu dlatego myślę, że jedną z takich funkcji jest obsługa FTP.
Możliwe jest zdalne sprawdzanie logów od serwera do którego mamy przykładowo dostęp tylko przez FTP, bo SSH na tanich hostingach WWW przecież nie udostępniają, a serwery logi generują :-)

A skoro mowa o funkcjach, to myślę, że przy okazji wymienię je w dużym skrócie: + Monitoring w czasie rzeczywistym + Możliwość zdalnego monitorowania przez FTP + Kompatybilność z Pythonem 2 i Pythonem 3, bardzo małe zależności + Rozszerzalne przez wtyczki i filtry + Prosta konfiguracja przez pliki "INI" + Własne poziomy ostrzeżeń  

Komentarze

0 nowych
4lpha   10 #1 14.09.2011 18:51

Już widzę logdetect'a w repo większości szanujących się dystrybucji :P

webnull, czemu wszystko w Pythonie? Twoja specjalizacja?

  #2 14.09.2011 18:58

@sunbeam96
A czemu nie ? Python jest otwartoźródłowy, interpretowany, szybki w pisaniu i zrozumieniu. Lepszy niz Bash ktory jest strasznie ciezki w pisaniu a Pythona i tak kazdy ma w systemie.

Logdetect to nie gra w full3d. Zreszta skoro Google i YT chodza na pythonie to kazdy duzy projekt moze.

webnull   9 #3 14.09.2011 20:17

@sunbeam96 | 14.09.2011 18:51
Po prostu w tym języku pisze się bajecznie prosto i wygodnie, a właśnie nauczyłem się w nim pisać.

webnull   9 #4 14.09.2011 21:28

@alkuzad (niezalogowany) | 14.09.2011 18:58
Dobrze ujęte, dzięki :-)

4lpha   10 #5 14.09.2011 21:30

@webnull | 14.09.2011 20:17
Znalazłem jakieś źródła w Pythonie, faktycznie, bardzo przejrzyste. Trzeba być nieźle podchmielonym, by nic nie zrozumieć ;P

Pigmej   5 #6 14.09.2011 22:46

@webnull

Kilka uwag:

-1
#!/usr/bin/env python
zamiast
#!/usr/bin/python

-2 zrob setup.py zeby latwiej instalowac ;-) (python setup.py install)

-3
try:
import sqlite3
except Exception:
True

zamiast True daj pass


-4
opcje warto by jednak zrobic na optparse lub argparse ;-) duzo wygodniej, lepiej i prosciej

-5
jeśli używasz wyrażenia regularnego więcej niż raz / kilka razy to warto je "skompilowac" regex = re.compile("..."), regex.match etc...

-6
log.main()

tak tez nie robimy :)

if __name__ == '__main__':
log.main()

dzieki temu mozna bedzie twoj modul zaimportowac bez jego uruchamiania ;-)


//pewnie wyjdzie sieczka z tego komentarza (formatowanie)

  #7 15.09.2011 10:00

"A czemu nie ? Python jest otwartoźródłowy, interpretowany, szybki w pisaniu i zrozumieniu. Lepszy niz Bash ktory jest strasznie ciezki w pisaniu a Pythona i tak kazdy ma w systemie."

Jest też koszmarnie powolny i łasy na zasoby jak smok :P I argument

"Logdetect to nie gra w full3d. Zreszta skoro Google i YT chodza na pythonie to kazdy duzy projekt moze."

Nie bardzo jest na miejscu ;)

Pigmej   5 #8 15.09.2011 14:04

@Van

Powolny ? Za przeproszeniem 'udowodnij' ;]

Limak   6 #9 15.09.2011 15:35

Ja bym po prostu do Crona wrzucił coś takiego (pisane na szybko z palca, więc nie wiem czy działa, ale jak nie popełniłem jakiegoś głupiego błędu to powinno):

if [ $('ls -lart pliczek.txt | cut -f6 -d" "') != $('echo /tmp/lastmod') ] then
echo $('ls -lart pliczek.txt | cut -f6 -d" "') > /tmp/lastmod;
wykonaj jakis skrypt;
fi

Robi to samo co logdetect ;) No ale oczywiście jest bardziej ograniczone, choćby częstością wykonania do maks 1 minuty (ograniczenie crona).

  #10 15.09.2011 15:55

@Pigmej

Swoją opinię opieram na swoim doświadczeniu. P4 2.8 Ghz z 1 GB RAM i większość z aplikacji wykonanych w Pythonie, które uruchamiałem na swoim komputerze, nieprzyjemnie zamulały. Gajim, Exaile, QuodLibet, kilka gier wykonanych w Pygame (i podobnych).

Tak jak teraz przyjrzałem się tej liście: https://secure.wikimedia.org/wikipedia/en/wiki/List_of_Python_software to faktycznie chyba trochę generalizuję. Ale mimo wszystko uważam, że Python nie może stanowić podstawy w żadnym szanującym się programie ;P

webnull   9 #11 15.09.2011 16:32

@Limak | 15.09.2011 15:35
To co napisałeś jest bardzo, bardzo ograniczone. Logdetect mogę dowolnie rozbudować w łatwy sposób gdzie skrypt napisany w Bashu wyglądałby koszmarnie przy tym.

Pigmej   5 #12 15.09.2011 18:19

@Van

Heh siła twoich argumentów 'poraża'... szczególnie "Ale mimo wszystko uważam, że Python nie może stanowić podstawy w żadnym szanującym się programie ;P"

Zapoznaj się choćby z PyPy

Z modułów na szeroką skale używanych choćby numpy.

Źle napisany program nie świadczy o języku, prawda jest taka że masa programów w PY ma podstawowe błędy i jest robiona 'na około.

Ta lista to tylko 'ułamek'.


W C/Cpp też da się napisac program który będzie zamulał. Programowanie nie jest 'banalne', a sporo osób bierze się za programowanie nie mając pojęcia o podstawowych zasadach etc a potem sie dziwić że 'zamula'. Podane przez Ciebie przykłady są znane z zamulania (może poza Gajim).

webnull   9 #13 15.09.2011 19:26

@Pigmej | 14.09.2011 22:46
Dzięki, część z nich zdołałem póki co wprowadzić.

  #14 15.09.2011 19:30

@Pigmej
Dzięki! Nie wiedziałem wcześniej o kilku rzeczach, o których napisałeś. Będę mieć to teraz na względzie.

Limak   6 #15 15.09.2011 20:39

@webnull: Nie no, jasne - zgodzę się z Tobą - ja nie krytykuję projektu logdetect - przeciwnie, dość rozbudowane jest to wszstko i ma spore możliwości konfiguracji. Ja chciałem tylko zaznaczyć, że do prostego automatycznego wykonywania akcji wywołanej zdarzeniem zmiany pliku można użyć krótkiego skrypciku.

webnull   9 #16 16.09.2011 11:12

@Van
Pewne rzeczy można zaimplementować na wiele sposobów.
Ja przykładowo w projekcie Subget źle zaimplementowałem kiedyś wątkowanie i cały interfejs się po prostu zawieszał na czas pobierania napisów (ok. kilka sekund). Python wcale nie musi być powolny.

  #17 16.09.2011 14:23

Moj pierwszy program do robienia napisow pod piosenki nie wiadomo czemu zzeral 100% CPU :P Ale to Delphi ^^

  #18 29.01.2013 16:10

Demon czytajacy logi w tle na pytonie?? Srednio to widze. To ma dzialac na serwerze wiec powinno byc lekkie i bardzo szybkie.
Jezyki typu python, java, php to takie jezyki dla lekko niepełnosprawnych programistow.

Latwo i przyjemnie sie pisze ale za jaka cene!! Wydajnosci!

Niech serwer http dostanie 300 requestow/s a twoj programik zabije serwerek.

ssh tail -f xxxx.log | tee xxx.txt - i logi masz na swoim pulpicie (robisz z nimi co chcesz i nie martwisz sie o nic) :P

Pozdro 600

  #19 27.02.2014 20:03

Swoją drogą, to kod tragicznie skomentowany, masz jakieś wyrażenie regularne, które tak na prawdę nie wiadomo co robi. Poza tym, czy trzeba na prawdę te wyrażenia regularne? Też kiedyś myślałem, że są fajne i chciałem wszędzie pakować, ale jeśli da się to zrobić klasycznie, to lepiej właśnie tak. Sprawdzenie "if ':' in Find[0][0]" przechodzi po tym elemencie tablicy, a potem "exp = Find[0][0].split(":")" znowu przechodzi ten element szukając wystąpienia i dzieląc odpowiednio. Postaraj się implementować najprostsze algorytmy bez używania funkcji z API, zobaczysz, że można często oszczędzić na złożoności i to dużo. A i swoją drogą, python jest obiektowy, a ten program nie. Robisz klasę, która jest po prostu zbiorem funkcji i obiektowego nic w niej nie ma.

I tak ogólnie co do pythona: język ciekawy, ale interpretowany czyli już z definicji wolniejszy niż kompilowane.