Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Logdatei durchsuchen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • marvinmarvin
    hat ein Thema erstellt [Erledigt] Logdatei durchsuchen.

    [Erledigt] Logdatei durchsuchen

    Moin,

    ich habe mitlerweile google so zum Schwitzen gebracht, dass ich absolut keine Hinweise auf meine Lösung finde.

    Ich habe eine Logdatei eines Webservers, der mit Nagios protokolliert wird. Alle Zugriffe sind dort in dieser Datei.
    Nun möchte ich mit PHP diese Datei nach vier Variablen durchsuchen:

    Hund
    Katze
    Maus
    Hamster

    Wenn ALLE diese vier Strings in einer Zeile vorkommen (wichtig!), soll er mir etwas hochzählen. Wenn nicht, nichts hochzählen.

    Mitlerweile habe ich mit strpos, !feof schon einige Versuche gestartet, aber nichts tut genau das was ich möchte. Hilft dort eine verschachtelte if Anweisung?

    Könnte man das so weiterführen?

    PHP-Code:
    $datei=file('LOGDATEI');
     foreach($datei AS $zeile){


        $ersteswort = strpos($zeile, "Hund");
        if ($ersteswort !== FALSE) {
        
        
            $zweiteswort = strpos($zeile, "Katze");
            if ($zweiteswort !== FALSE) {
            
            
                echo $ersteswort;
            
            
            }
            
        }
        
    }



     ?>

    <?php 
        
    echo "Ergebnis:  $ersteswort";
    ?><br>
    Danke schonmal im vorraus!
    Grüße

  • hausl
    antwortet
    glaube strpos sucht nur in einer Zeile
    - strpos() druchsucht den String den du der Funktion übergibst.

    - deine hilfsvars $ersteswort, etc.. brauchst du nicht, ist unnötig, zumindest in dem Beispiel oben

    - warum machst du die Bedingungen nicht mit einfachem "and" ? siehe beispiel von mir oben.

    - wenn du auf die selbe datei so viele Kombinationen anwendest würde ich mir eine Funktion schreiben die Zeile für Zeile alle Varianten absucht an statt die Datei x mal durchzugehen

    Und alle 30 Tage diese Excel Liste als Mail versendet werden. Ist das mit PHP überhaupt möglich?
    Ja, ja.

    CronJob. Zum Format: csv wäre einfacher, aber ExcelWriter gibt es meines Wissens auch wo, hab ich selbst aber noch nie gebraucht -> google, php-doku.

    Einen Kommentar schreiben:


  • lottikarotti
    antwortet
    Zitat von alxy Beitrag anzeigen
    Es sollen ja alle Begirffe in einer Zeile vorkommen...
    Danke für den Hinweis. Dieser Umstand ist mir in der Eile vollkommen entgangen. Ich habe meinen Post entsprechend um ein weiteres Beispiel ergänzt.

    PS: Das sollte nur als Denkanstoß dienen. Mit etwas Eigeninitiative wird der TE damit sein Problem schon lösen können, aktuell dümpelt er aber immer noch mit der "sinnlos verschachtelte IFs"-Variante herum

    Viele Grüße,
    lotti

    Einen Kommentar schreiben:


  • marvinmarvin
    antwortet
    Ich glaube strpos sucht nur in einer Zeile. Also wenn ich es mir ausgeben lasse, zeigt er mir genau die Zeilen an, wo alle vier Kriterien in EINER Zeile vorkommen. Schonmal super!
    Beim Zählen komme ich auf mögliche Zahlen.

    PHP-Code:
    $datei=file('LOGDATEI');
     
     
     
    $in 0
     
    $inssl 0;
     
    $out 0;
     
    $outssl 0;
     
     
    foreach(
    $datei AS $zeile){

        
    $ersteswort strpos($zeile"Hund");
        if (
    $ersteswort !== FALSE) {

            
    $zweiteswort strpos($zeile"Katze");
            if (
    $zweiteswort !== FALSE) {
            
                
    $dritteswort strpos($zeile"Maus");
                if (
    $dritteswort !== FALSE) {
                
                    
    $vierteswort strpos($zeile"Hamster");
                    if (
    $vierteswort !== FALSE) {
                    
                        
    $in++;
                    }
                }
            }
        }
    }

    foreach(
    $datei AS $zeile){

        
    $ersteswort strpos($zeile"Hund");
        if (
    $ersteswort !== FALSE) {

            
    $zweiteswort strpos($zeile"SSL-Katze");
            if (
    $zweiteswort !== FALSE) {
        
                        
    $inssl++;
            }
        }
    }

    foreach(
    $datei AS $zeile){

        
    $ersteswort strpos($zeile"Hund");
        if (
    $ersteswort !== FALSE) {

            
    $zweiteswort strpos($zeile"Katze");
            if (
    $zweiteswort !== FALSE) {
            
                
    $dritteswort strpos($zeile"Maus");
                if (
    $dritteswort !== FALSE) {
                
                    
    $vierteswort strpos($zeile"Hamster");
                    if (
    $vierteswort == FALSE) {
                    
                        
    $out++;
                    }
                }
            }
        }
    }

    foreach(
    $datei AS $zeile){

        
    $ersteswort strpos($zeile"Hund");
        if (
    $ersteswort !== FALSE) {

            
    $zweiteswort strpos($zeile"SSL-Tier");
            if (
    $zweiteswort !== FALSE) {
        
                        
    $outssl++;
            }
        }

    Nun sollen diese Werte am besten in eine Excel Liste exportiert werden (jeden Tag). Und alle 30 Tage diese Excel Liste als Mail versendet werden. Ist das mit PHP überhaupt möglich?

    Einen Kommentar schreiben:


  • hausl
    antwortet
    lotti, fast:
    Wenn ALLE diese vier Strings in einer Zeile vorkommen (wichtig!),
    Und Logfiles müffelt irgendie immer auch nach riesigen Files, daher hatte ich zu Beginn zumindest mit zeilenweiser Verarbeitung begonnen.. Aber als der TE dann mit file() ankam..

    Einen Kommentar schreiben:


  • alxy
    antwortet
    Es sollen ja alle Begirffe in einer Zeile vorkommen...

    Einen Kommentar schreiben:


  • lottikarotti
    antwortet
    In solchen Fällen würde ich zu einem regulären Ausdruck greifen:

    OR-Variante:
    PHP-Code:
    <?php

    $log 
    = <<< LOG
    Ein Hund bellt gerne und frisst viel.
    Viele Katzen jagen bei Nacht.
    Der Hals von Giraffen ist ziemlich lang.
    Zebras sind gestreifte Pferde.
    LOG;

    $list = [
        
    'hund',
        
    'katze',
        
    'zebra',
        
    'pferd'
    ];
    $exp sprintf('/.*(?:%s).*/i'implode('|'$list));
    preg_match_all($exp$log$matches);
    print_r($matches);
    Ausgabe:
    PHP-Code:
    Array
    (
        [
    0] => Array
            (
                [
    0] => Ein Hund bellt gerne und frisst viel.
                [
    1] => Viele Katzen jagen bei Nacht.
                [
    2] => Zebras sind gestreifte Pferde.
            )


    Edit:
    Um alxy's Hinweis nachzukommen, möchte ich das Beispiel um eine AND-Variante ergänzen:

    AND-Variante:
    PHP-Code:
    <?php

    $log 
    = <<< LOG
    Lorem ipsum dolor sit amet, consetetur sadipscing elitr
    sed diam nonumy eirmod tempor invidunt ut labore et
    dolore magna aliquyam erat, sed diam voluptua. At vero
    eos et accusam et justo duo dolores et ea rebum
    takimata sanctus est Lorem ipsum dolor sit amet. Lorem
    LOG;

    $list = [
        
    'dolor',
        
    'lorem'
    ];

    $exp sprintf('/(?=.*%s).*/i'implode(').*(?=.*'$list));
    preg_match_all($exp$log$matches);
    print_r($matches);
    Ausgabe:
    PHP-Code:
    Array
    (
        [
    0] => Array
            (
                [
    0] => Lorem ipsum dolor sit ametconsetetur sadipscing elitr
                
    [1] => takimata sanctus est Lorem ipsum dolor sit ametLorem
            
    )


    Viele Grüße,
    lotti

    Einen Kommentar schreiben:


  • hausl
    antwortet
    mit file() so in der Art:

    PHP-Code:
    datei file("log.txt");
    $count 0

    foreach (
    $datei AS $zeile) {

    if (
         
    strpos($zeile"Hund") !== false and
         
    strpos($zeile"Katze") !== false and
         
    strpos($zeile"Hamster") !== false and
         
    strpos($zeile"Maus") !== false
       
    ) { 
           echo 
    $zeile'<br>'
           
    $count++; 
         }  

    LG

    Einen Kommentar schreiben:


  • marvinmarvin
    antwortet
    Also so gibt er mir schonmal alles aus was ich möchte:

    PHP-Code:
    $datei=file('LOGDATEI');
    foreach(
    $datei AS $zeile){

        
    $ersteswort strpos($zeile"Hund");
        if (
    $ersteswort !== FALSE) {

            
    $zweiteswort strpos($zeile"Katze");
            if (
    $zweiteswort !== FALSE) {
            
                
    $dritteswort strpos($zeile"Maus");
                if (
    $dritteswort !== FALSE) {
                
                    
    $vierteswort strpos($zeile"Hamster");
                    if (
    $vierteswort !== FALSE) {
                    
                        echo 
    $zeile;
                        echo 
    '<br>';
                    
                    }
                    
                }
                
            }
            
        }



    Jedoch zählt er nun (noch) nicht eine Variable hoch? Würde das mit $test++ gehen?

    Einen Kommentar schreiben:


  • hausl
    antwortet
    Ein Logfile ist vermutlich groß. Auf die Schnelle, du könntest die Datei zeilenweise verarbeiten und wenn
    die Wörter ("and") in der jeweils aktuellen Zeile enthalten sind dann ausgeben und sonst nicht.

    http://php.net/manual/de/function.fgets.php und strpos() hast du ja schon.

    Alternativ kannst du dir noch file() ansehen, dass haut die ganze Datei zeilenweise in ein Array, aber wenn das Logfile "zu groß" ist, weiß nicht wie sich das dann "handelt".

    LG

    Einen Kommentar schreiben:

Lädt...
X