halloICKEbins
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Mahlzeit, Ich wurde gerne mal eure Meinung zur Umsetzung einer Suche wissen: Habe ca. 1000 Dateien (bis jetzt) mit jeweils 1.700 Einträge pro Datei. Die Datei enthält pro Zeile exemplarisch die unten genannten Einträge:
Mar 20 08:08:45 hostname feb FW: so-0/1/0.0 A icmp 192.168.207.222 80.90.100.290:38273 [0xs9] Ich hätte jetzt die Möglichkeit die Dateien in einen MySQL-DB zu schreiben (pro Datei eine Tabelle mit 2 Spalten für Zeilennummer und Inhalt der Zeile) um dann über eine indexierte Suche auf die zweite Spalte, zu suchen. Habe gelesen, dass bei 100.000 Einträgen ca. 17 Vergleiche angestellt werden müssen. Zweite Möglichkeit wäre eine Suche über Python3 in den Dateien selber (siehe Quellcode) und das Ergebnis dann in eine DB bzw. Datei übergeben.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | import os
path='/files/logs/'
searchstring = "192.168.207.222" # oder "icmp" oder "38273"
for filename in os.listdir(path):
with open(path + filename, "r") as f:
searchlines = f.readlines()
for i, line in enumerate(searchlines):
if searchstring in line:
for l in searchlines[i:i+1]:
print (filename, i + 1, l)
while True:
location = l.find(searchstring, location + 1)
if location == -1:
break
print (location)
|
Problem an der zweiten Möglichkeit besteht darin, dass ein Cronjob (Script) die Auslösung mittels HTML (PHP) zum Beispiel sekündlich überwachen müsste um Wartezeiten bei der Suche des auslösenden Nutzers zu verhindern. Vielleicht gibt es hier auch andere Möglichkeiten??? Die dritte Möglichkeit über PHP in den Dateien zu suchen habe ich schon selber mal umgesetzt... funktionierte auch ganz gut bei wenigen Dateien...wurde jetzt aber durch die Anzahl der Dateien relativ unrentabel!!!
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4578
Wohnort: Berlin
|
@halloICKEbins: Also das mit der Datenbank klingt sehr falsch. Zum einen das Du 1000 Tabellen anlegen willst die alle die gleiche Struktur haben und zum zweiten das Du Textdateien als zwei Spalten mit Zeilennummer als Index und Zeileninhalt als zweite Spalte speichern möchtest. Welchen Vorteil soll das bringen und mit welcher Magie willst Du da schneller in den Werten in der zweiten Tabelle suchen als durch serielles lesen der Textdateien und suchen in den Zeilen? Und was haben die 100.000 Einträge, die Du ja gar nicht hast, mit 17 was für Vergleichen zu tun? Da ist doch sicher von der Suche in einem Index die Rede, das sind die Zeilennummern, wonach Du aber gar nicht suchst. (Das würde allerdings wenigstens ansatzweise Sinn machen um solche Dateien in eine relationale Datenbanktabelle zu stecken.)
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Wächst die Zahl noch? Pro Tag eine Datei? Hast Du die typischen Suchen schon alle genannt? Wieso hast Du überhaupt 1000 Dateien? Lass uns überschlagen, 1000 * 1700 ist ca. 2 Mio. Bei 100 Zeichen pro Zeile also 200 Mio. Bytes. Die sind mit grep in weniger als 1s durchsucht (bei einer Datei) - auf einem SSD-Drive. Wie schnell soll es werden? Bei 1000 Dateien müsstest Du mal probieren, wie lange ein | grep 192.168.207.222 /var/log/foobar*.log
|
dauert, oder wie die Dateien auch heißen und wo sie liegen. Bei massig output dauert das Schreiben auf den Bildschirm viel länger, als die Suche, also probier etwas mit wenig Resultaten. Bei mir bei 150 MB 0.2 s.
|
encbladexp
Ehemaliger
Anmeldungsdatum: 16. Februar 2007
Beiträge: 17449
|
Vor allem ist die Frage nach was du wirklich Suchen willst. Willst du nur nach einem Teil vom Text suchen, oder könnte man die Dateien Parsen und für die Datenbank aufbereiten? Das kann nämlich, gerade wenn öfters Auswertungen/Suchen laufen, erheblichen Einfluss auf die Geschwinigkeit haben. Wenn du nur "ab und an" was machen willst, dann ist grep effizient genug. Aber je spezifischer und häufiger du Informationen brauchst, desto mehr performt eine Datenbank, wenn deren Struktur passt. mfg Stefan
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Es kann auch sinnvoll sein, in 2 Dateien zu suchen, in einer großen von Gestern bis Bismark, und einer kleinen, die wächst, von heute. Bei der von gestern kann der Cache die Datei die ganze Zeit im Speicher halten.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Dann hatte ich ja schonmal eine Antwort ob MySQL oder nicht. Aber gibt es eine andere Möglichkeit der Initiierung durch den Nutzers außer über ein Cronjob - welcher zum Beispiel in die DB schaut ob die Suche gestartet werden soll ???
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11180
Wohnort: München
|
Mir ist das Szenario noch nicht so ganz klar - woher kommen die Daten, was davon ist interessant, was soll der User auf welchem Wege darin suchen können?
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Der Nutzer soll alles im String suchen können ... Die Dateien sind Logs, welche ca. alle 4 Stunden neu abgespeichert werden
|
encbladexp
Ehemaliger
Anmeldungsdatum: 16. Februar 2007
Beiträge: 17449
|
Woher kommen die Logs? Lass dir doch nicht alles aus der Nase ziehen 😉 mfg Stefan
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Sind pflogs von OpenBSD-Firewalls...der komplette Eintrag ist halt wichtig und ich möchte halt nach allem filtern
|
encbladexp
Ehemaliger
Anmeldungsdatum: 16. Februar 2007
Beiträge: 17449
|
Gut, aber für Logfiles gibt es dedizierte Softwarelösungen. Logstash ist eine davon, gibt aber noch mehr am Markt. mfg Stefan
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Ich finde Du schuldest uns noch eine Antwort, wie schnell es jetzt ist und wie schnell es werden soll. Zur Frage SSD oder Festplatte aus den 80ern hast Du Dich auch nicht geäußert. Auch nicht dazu, wieso es so viele Dateien sein sollen. halloICKEbins schrieb: Aber gibt es eine andere Möglichkeit der Initiierung durch den Nutzers außer über ein Cronjob - welcher zum Beispiel in die DB schaut ob die Suche gestartet werden soll ???
Wenn die Dateien minütlich oder häufiger aktualisiert werden - bzw. anders gesagt: Man startet cronjobs nicht minütlich. Man kann beim Systemstart ein Script starten, das endlos läuft, und bei jeder Runde eine Sekunde oder mehr oder weniger pausiert, damit der Rechner währenddessen anderes tun kann.
| while true
do
echo "hier die wahre Arbeit"
sleep 1
done
|
Nur verstehe ich noch nicht, wieso das überhaupt ständig arbeiten soll. Der User will nach 192.168.4.5 suchen und Du bekommst diese Information. Dann suchst Du danach. Was willst Du vorab tun?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
halloICKEbins schrieb: Sind pflogs von OpenBSD-Firewalls...der komplette Eintrag ist halt wichtig und ich möchte halt nach allem filtern
Dann ist möglicherweise eine Spalte für den Text nicht so verkehrt - kombiniert mit einem Volltextindex. SQLite kann das und PostgreSQL auch z.B. Wenn, ja wenn, die direkte Suche mit grep und Co. nicht schnell genug ist. Ich hätte allerdings auch gerne noch eine Beschreibung des Szenarios, u.a. solcher Fragen wie viele Anfragen erwartet werden, wie groß sind die Logs, wie soll aufgeräumt werden usw.
|
halloICKEbins
(Themenstarter)
Anmeldungsdatum: 12. September 2017
Beiträge: 226
|
Dann versuche ich mal weiter auszuholen...und das Gesamtkonstrukt zu erläutern... In "meiner" Umgebung gibt es mehrere Firewalls auf OpenBSD-Basis, mehrere L2-Cisco-Switche und L3-Cisco-Router...Die meisten "meiner" OpenBSD-Firewalls generieren mittels "logrotate" ca. aller 4 Stunden eine pflog.0 (ca. 1700 Zeilen) pro Gerät...diese werden auf einem Ubuntu-Server mittels push-Prinzip zentral gesammelt und mehreren Nutzern mittels PHP im Ordner (/www/html/.../pflogsfiles) bereitgestellt...des weiteren werden von den L2/L3-Geräten diverse weitere Informationen (arp, vlan, status interface, usw.) gesammelt und ebenfalls auf der Informationsseite dargestellt. Der Nutzer soll eine zentrale Informationsquelle haben und über diese natürlich auch seine Suche steuern können...ohne Ahnung von der Konsole haben zu müssen und nicht zu switchen zwischen PHP, Shell usw. @user_unknown: Nur verstehe ich noch nicht, wieso das überhaupt ständig arbeiten soll. Der User will nach 192.168.4.5 suchen und Du bekommst diese Information. Dann suchst Du danach. Was willst Du vorab tun?
Ich weiß ja nicht, wann der Nutzer was suchen will, also muss ich ja irgendwie die Anfrage abfangen...
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
halloICKEbins schrieb: Ich weiß ja nicht, wann der Nutzer was suchen will, also muss ich ja irgendwie die Anfrage abfangen...
Gut, und das machst Du in einer Endlosschleife, die einmal gestartet werden muss. Was soll da ein cronjob? PHP ist aber nicht mein Fall. Die Geschwindigkeit von Grep sollte aber einen Anhaltspunkt bieten, was möglich ist.
|