PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : logdateien mit php auswerten



laolamia
05-10-2004, 16:22
hallo!

ich moechte mir eine serveradminseite bauen :)
da sollen diverse logdateien per knopfdruck angezeigt werden (access.log, messages.log u.s.w)

eventuell soll noch die squid log nach ip durchsucht werden.

ich hab schon gegoogelt aber elider nichts gefunden.
bin ich den der erste der sowas machen moechte ? ;)

hat jemand eventuell einen weiterfuehrenden link?

danke

Pingu
06-10-2004, 07:07
ich moechte mir eine serveradminseite bauen :)
da sollen diverse logdateien per knopfdruck angezeigt werden (access.log, messages.log u.s.w)

eventuell soll noch die squid log nach ip durchsucht werden.

Entweder Du möchtest etwas machen und hast konkrete Fragen bei denen wir Dir helfen können.


ich hab schon gegoogelt aber elider nichts gefunden.
bin ich den der erste der sowas machen moechte ? ;)

Oder Du willst etwas fertiges, wie z.B. Webmin (http://www.webmin.com)

Installation z.B. mit apt-get install webmin

Pingu

laolamia
06-10-2004, 07:31
hi!

ich moechte sowas machen und suche anregungen :)
webmin hab ich schon.

haett ja sein koennen das es sowas gibt und dann wird ich es halt fuer meine bedürfnisse anpassen :)

shb
06-10-2004, 07:32
ich geb mal noch nen denkanstoß. mit file() kannst du dateien einlesen und mit system() kannst du auf system programme zugreifen

cu SHB

Pingu
06-10-2004, 07:54
ich geb mal noch nen denkanstoß. mit file() kannst du dateien einlesen und mit system() kannst du auf system programme zugreifen
Infos dazu gibt es hier

file() (de3.php.net/file)
system() (de3.php.net/system)


Weitere interessante Funktionen dazu könnten sein:

is_file() (de3.php.net/is-file)
dir() (http://de3.php.net/manual/de/class.dir.php)


Pingu

laolamia
06-10-2004, 10:53
danke, sowas hab ich gesucht :)
dann kann ich meine logdatein anzeigen und eigene scripte ausfuehren.

laolamia
08-10-2004, 09:52
hallo!

das anzeigen meiner logdateien funktioniert schon ganz gut.

nun moechte ich aber die datei erst durchsuchen und dann nur das ergebnis ausgeben.

zb. ueber ein suchfeld eine ip eingeben und dann die ausgabe auf diese ip beschraenken (access_log)


<?php
$Datei = file("access_log");
for ($i=count($Datei);$i>=0;$i--) {
$Zeile = explode('<br>',$Datei[$i]);
echo "$Zeile[0]<hr> ";
}
?>

also ich muss ja die eingabe in eine Variable schreiben ($eingabe)
dann muss die datei nach dieser zeile durchsucht werden und per echo ausgegeben werden.

danke

undefined
08-10-2004, 10:37
Dann must du matchen siehe eregi()/preg_match_all() oder preg_match()
mfg undefined

laolamia
08-10-2004, 11:11
hmmmm, erstmal ne generelle frage:

woher weissich das ich nach pre_match und ereg suche muss?
ich hab das kapitel "umgang mit datensaetzen" durchstoebert :eek:

aber nach deinem hinweis hab ich mal nachgelesen und etwas probiert, leider ohne erfolg.


#<?php
#
#$suche = "(10.128.9.30)";
#$datei = "access_log";
#echo eregi ($suche, $datei, $ergebnis);
#echo $ergebnis[0], "<br>";
#echo $ergebnis[1], "<br>";
#
#?>

da in der datei diese ip vorkommt haette ich doch ne anzeige bekommen muessen?!
ich glaub das ist mir zu hoch :(

Pingu
08-10-2004, 11:41
hmmmm, erstmal ne generelle frage:

woher weissich das ich nach pre_match und ereg suche muss?
ich hab das kapitel "umgang mit datensaetzen" durchstoebert :eek:
Generell: Indem man sich die Zeit nimmt und die Funktionsreferenz (http://de2.php.net/manual/de/funcref.php) durchliest (man muß ja nicht jede einzelen Funktion ansehen, deswegen gibt es ja die Gruppierung), um einen Überblick und ein Gefühl dafür bekommt wo was zu finden ist.

Speziell: Daß es bei Dir Datensätze sind, hat nichts mit der Suche zu tun. Aber der generelle Fall ist: Ich möchte Suchen. Denn es könnte ja auch ein Suchen in einem Fließtext sein. Und was ist Datensatz? Ein Text. Ansonsten, wenn man in einer Datenbank sucht, dann stellt die Datenbank die Hilfsmittel zur Verfügung und nicht die Programmiersprache, in diesem Fall php.


aber nach deinem hinweis hab ich mal nachgelesen und etwas probiert, leider ohne erfolg.


#<?php
#
#$suche = "(10.128.9.30)";
#$datei = "access_log";
#echo eregi ($suche, $datei, $ergebnis);
#echo $ergebnis[0], "<br>";
#echo $ergebnis[1], "<br>";
#
#?>

da in der datei diese ip vorkommt haette ich doch ne anzeige bekommen muessen?!
ich glaub das ist mir zu hoch :(
Da stellt sich bei mir die Frage: Die IP kommt zwar vor, aber kommt sie auch genau so vor? Denn Du suchst ja nach (10.128.9.30). Soweit ich weiß, sind die IPs in der access.log aber nicht in Klammern geschrieben. Also müßtest Du nach 10.128.9.30 suchen. Richtig wäre es dann somit:
<?php

$suche = "10.128.9.302";
[snip]
?>

Dann das zweite: Was ist das?

$datei = "access_log";
echo eregi ($suche, $datei, $ergebnis);

Du suchst also nach (10.128.9.30) in der Zeichenkette access_log. Daß er da nichts findet ist ja wohl klar. Ich dachte auch, daß Du in der Datei Suchen möchtest. Also mußt Du ersteinmal die Datei einlesen.

Sorry, aber einen Programmier-Workshop werde ich jetzt hier nicht veranstalten. Die Grundlagen muß schon jeder für selbst ersteinmal erarbeiten, sei es über ein Buch, einen VHS-Kurs, einen Schulkurs oder Selbststudium, indem man das Manual liest und versucht die dort angegeben Beispiele zu verstehen.

Pingu

laolamia
08-10-2004, 11:51
danke, ich habs mit und ohne klammer versucht.
der fehler ist wohl das fehlende einlesen der datei :)

undefined
08-10-2004, 13:27
Dein erster Code war doch in Ordnung. Es fehlte halt nur der match Befehl.

<?php
if ( file_exists( "access_log" ) )
{
$Datei = file("access_log");
$buffer = array();
foreach ( $Datei AS $z => $v )
{
if ( preg_match( "/([\d]+[\.]*)/", $v ) )
$buffer[] = "Zeile $z ist $v";
}

print_r( $buffer );
}

?>
im file

#
#
#
#
#
156.168.20.1
192.15.20.12
192.168.1.33
#
#
#
#
#
#
mfg undefined

BlueJay
09-10-2004, 19:55
also ich muss ja die eingabe in eine Variable schreiben ($eingabe)
dann muss die datei nach dieser zeile durchsucht werden und per echo ausgegeben werden.


Wie fett sind denn deine Logfiles?
Hintergrund: ich habe ebenfalls lange mit php herumgetrickst, um mir verschiedene Statistiken ausgeben zu lassen. Als meine Seite noch relativ unbekannt war, lief die Verarbeitung mit php recht gut.

Dann kam die Zeit, wo das Progrämmchen in den zugestandenen 30s nicht mehr mit der Aufgabe fertig wurde. - Also beim Webmaster um mehr Rechenzeit gebettelt.
(Ich arbeitete mit strpos, nicht mit preg_match, Grund siehe hier:
http://de3.php.net/manual/de/function.preg-match.php
)

Dann kam die Zeit, wo das php-Progrämmchen so 2 Stunden am Rödeln und der Webmaster ziemlich sauer war. (ca. 6000 - 7000 Fundstellen aus ummi 300 - 500 MB auswerten)

Nach 6 Wochen hat er mir dann die Pistole auf die Brust und einen C-Compiler vor die Nase gesetzt.

Nun läuft die Auswertung über C mit viel Gepointere, malloc und strstr (nicht C++!) und husch, husch, in ca. 2 min sind die ca. 6000 Fundstellen isoliert und in der Datenbank verpackt.

C++ (mit streams und GUI-Frontend) brauchte 8 Minuten.

Nun weisst du warum Logfileauswertung via php nicht das Gelbe vom Ei ist.

so long,
BlueJay, die so zu C/C++ kam...

Pingu
11-10-2004, 06:05
[QUOTE=BlueJayDann kam die Zeit, wo das php-Progrämmchen so 2 Stunden am Rödeln und der Webmaster ziemlich sauer war. (ca. 6000 - 7000 Fundstellen aus ummi 300 - 500 MB auswerten)[/QUOTE]
Deswegen macht man das ja auch nicht online, sondern offline mit cron und einem niedrigen Nicelevel. Das dauert dann zwar vielleicht einbischen. Wegen dem niedrigen Nicelevel ist das aber egal. Da Historie ausgewertet wird, ist es auch egal, ob die Historie nun ein paar Stunden (ein zwei Tage) älter ist oder nicht.

Wer eine online Auswertung will, wertet sowie so nicht die Logfiles, sondern die aktuellen Zugriffe aus (z.B. direkt nach der Auslieferung des Contents) und bereitet diese gleich für die Darstellung auf.

Pingu

laolamia
11-10-2004, 06:44
moin!

die sache ist fuers intranet und da macht mir kein provider aerger :)
die groesse der logdateien kann ich ja selber bestimmen.

ich werd mal etwas weiter basteln :)

BlueJay
11-10-2004, 20:02
[php-Logfileauswertung]

Tja, Pingu, damals arbeitete ich noch mit Windows, und die einzige Programmiersprache, die ich zur Verfügung hatte, und die mit solchem Kram überhaupt fertig wurde, war eben php.

Der Webmaster gab mir schon ein Zeitfenster dafür, nur das musste immer größer werden. Und je größer es wurde, desto länger wurde sein Gesicht. ;)

Mittlerweile bin ich froh, dass er mir Linux und C verpasst hat. Da braucht php nur das Ergebnis darstellen.

so long,
BlueJay

laolamia
12-10-2004, 13:55
hallo!

hab nun etwas rumgebastelt und das kam dabei raus :)



<pre>
<?php
if ( file_exists( "access_log" ) )
{
$Datei = file("access_log");
$suche = "/10.128.9.30/";
$buffer = array();
foreach ( $Datei AS $z => $v )
{
if ( preg_match( $suche, $v ) )
$buffer[] = "Zeile $z ist $v" ;


}
print_r( $buffer ) ;
}
?>
</pre>

ich werde als naechsten schritt $suche von einem formular auswerten :)
ich bin den umweg ueber <pre> gegangen weil ich es nicht geschaft habe nach print_r <hr> einzufuegen :(
(muesste doch aber auch gehen oder?)

undefined
12-10-2004, 14:51
hallo!

hab nun etwas rumgebastelt und das kam dabei raus :)



<pre>
<?php
if ( file_exists( "access_log" ) )
{
$Datei = file("access_log");
$suche = "/10.128.9.30/";
^^^^^^^^^^^^^^^^^
$buffer = array();
foreach ( $Datei AS $z => $v )
{
if ( preg_match( $suche, $v ) )
$buffer[] = "Zeile $z ist $v" ;


}
print_r( $buffer ) ;
^^^^^^^^^^^^^^^^
}
?>
</pre>

ich werde als naechsten schritt $suche von einem formular auswerten :)
ich bin den umweg ueber <pre> gegangen weil ich es nicht geschaft habe nach print_r <hr> einzufuegen :(
(muesste doch aber auch gehen oder?)
Ein Blick in die PHP Manual würde dir gut tun :D
Dort steht nämlich drinne was welche Funktion wo und wie bewirkt!
das hier ist völlig falsch!


$suche = "/10.128.9.30/";
^^^^^^^^^^^^^^^^

das Ergebnis deines Regex wäre.
Suche Zahl 10 = 10 Irgendein Zeichen = .
Suche Zahl 128 = 128 Irgendein Zeichen = .
Suche Zahl 9 = 9 Irgendein Zeichen = .
Suche Zahl 30 = 30 Irgendein Zeichen = .
Richtig wäre:


$suche = "/([\d{1,3}]\.){3,4}/";

Ergibt: Suche Zahl 1-3 Stellen mit Punkt 3 - bis 4 mal!

Wenn du genau ein IP Finden möchtest dann nehme ereg()

mfg undefined

undefined
12-10-2004, 16:27
Vorlage


#
#ccvjdhsfahfhfhdjkfhkj100.245.237.1fhdlghfhdfdlhh
wenn im Text meine IP(192.168.30.45)steht dann auch.
100.245.237.1
Ganz am Ende 1.245.7.1
#



<?php
//Beispiel Alle IP Adresssen auslesen
if ( file_exists( "access_log" ) )
{
$Datei = file("access_log");
$buffer = array();
foreach ( $Datei AS $z => $v )
{
if ( preg_match( "/([\d]+[\.]*)/", $v ) )
{
preg_match_all( "/([\d{1,3}]+(?>\.?)){4}/", $v, $ip, PREG_SET_ORDER );
$buffer[] = $ip[0][0];
}
}
echo "<pre>";
print_r( $buffer );
echo "</pre>";
}
//Beispiel nur eine IP Adresssen auslesen
if ( file_exists( "access_log" ) )
{
$Datei = file("access_log");
$buffer = array();
$suche = "192.168.30.45";
foreach ( $Datei AS $z => $v )
{
if ( ereg( $suche, $v ) )
{
preg_match_all( "/(" . $suche . ")/", $v, $ip, PREG_SET_ORDER );
$buffer[] = $ip[0][0];
}
}
echo "<pre>";
print_r( $buffer );
echo "</pre>";
}
?>

mfg undefined

laolamia
12-10-2004, 16:38
das muss ich mir mal auseinandernehmen :)
das soll ich aus dem php manuel rauslesen? :eek:

undefined
12-10-2004, 17:04
Steht alles drinne ;) Ist für mich eine der besten Manuals die ich kenne.