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

  • [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

  • #2
    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
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      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?

      Kommentar


      • #4
        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
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          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
          [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

          Kommentar


          • #6
            Es sollen ja alle Begirffe in einer Zeile vorkommen...

            Kommentar


            • #7
              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..
              The string "()()" is not palindrom but the String "())(" is.

              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #8
                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?

                Kommentar


                • #9
                  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
                  [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                  Kommentar


                  • #10
                    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.
                    The string "()()" is not palindrom but the String "())(" is.

                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar

                    Lädt...
                    X