Sebastian Jurk: Array formatiert in Logdatei schreiben?

Hallo,

ich habe eine .log-Datei (einfache .txt) erstellt welche ich aus php heraus mit Inhalten fülle. Darunter auch verschiedene Arrays. Die Arrays und auch das log werden zusätzlich auf dem Bildschirm ausgegeben. Bei der Ausgabe von Arrays kann ich für den Bildschirm ja mit <pre> und print_r() ein Array gut lesbar ausgeben. Das selbe würde ich gern mit der Datei machen. Allerdings hat bisher alles was ich versucht habe nicht geklappt. Und ich will auch nicht eine extra Routine schreiben um die Arrays lesbar abzuspeichern da es verschiedene sind und es den Aufwand nicht lohnen würde.

Gibt es eine Möglichkeit die Formatierung in die log-Datei zu übernehmen damit man es ordentlich lesen kann?

Danke!
Sebastian

  1. Gibt es eine Möglichkeit die Formatierung in die log-Datei zu übernehmen damit man es ordentlich lesen kann?

    serialize($ar)
    json_encode($ar)

    Danke!
    Sebastian

    Bitte!

    Fred

    1. Ne, das ist nicht was ich suche. Das ist auch nicht übersichtlicher als print_r( , true);.

      Schau mal da unten auf der Seite: http://selfphp.info/funktionsreferenz/variablen_funktionen/serialize.php

      Das was er als unserializierten Code angibt, so soll der Text in die Datei geschrieben werden. Halt wie

      echo '<pre>'. print_r($array, true) . '</pre>';

      nur halt nicht für html sondern direkt in der Textdatei. Also mit allen nötigen Zeilenumbrüchen und Tabs bzw leerzeichen.

      Ich habe schon eine Weile gesucht aber keine passende Funktion gefunden.

      Grüße!
      Sebastian

      1. hi,

        Das was er als unserializierten Code angibt, so soll der Text in die Datei geschrieben werden.

        Du verstehst Dein Handwerk nicht: Dein Code möchte mit der Datei kommunizieren, nicht der Bildschirm.

        Hotti

        1. Passt hier auch: Warum mögen viele hier im Forum keine Fragen stellen?

          Eben nicht. Es soll nur eine .log-Datei sein in der ich nachschauen möchte was in der letzten Zeit passiert ist. Und multidimensionale arrays sind halt schwer zu lesen wenn alle Werte usw einfach komplett hintereinander geschrieben sind.
          Der Code wertet das log-File nicht aus.

          Grüße!
          Sebastian

          1. Hallo Sebastian!

            Passt hier auch:

            Wusstest du, dass sich die Qualität der Antworten oft nach der Qualität der Fragestellung richtet? [Zitat aus dem Forum-Kopf]

            Eben nicht. Es soll nur eine .log-Datei sein in der ich nachschauen möchte was in der letzten Zeit passiert ist. Und multidimensionale arrays sind halt schwer zu lesen wenn alle Werte usw einfach komplett hintereinander geschrieben sind.

            Also du möchtest Daten in eine Log Datei (.txt) schreiben und dir dann diese Datei mittels eines Programms (einem Text-Editor) angucken?
            Und dabei soll der Inhalt "formatiert" angezeigt werden?
            Wenn dem so ist, dann hast du in diesem Thread bereits alle Informationen dazu erhalten.
            Wenn dir das nicht ausreicht, dann liegt die Vermutung nahe, dass uns deine gelieferten Informationen nicht ausreichen.

            Der Code wertet das log-File nicht aus.

            Welcher Code?
            Und was heißt hier "auswerten"? Ich dachte es geht um "Formatierung" für eine gewünschte Darstellung!?

            Gruß Gunther

            1. Hallo Gunther,

              ja, habe die Lösung gefunden. :)

              Code wurde von hotti erwähnt. Weil er/sie vermutlich meinte dass mein Programm das Logfile auswerten müsste. Das log ist aber für das Programm nicht relevant. Es ist nur zur Ansicht um Probleme während des Programmablaufs zu erkennen.

              Grüße!
              Sebastian

      2. Ne, das ist nicht was ich suche. Das ist auch nicht übersichtlicher als print_r( , true);.

        Ich wiss nicht, was Du willst. Ich bin mir fast sicher, Du weisst auch nicht, was Du willst.

        Du hast noch nicht mal beschrieben, was Du für "Arrays" hast. Im Fall einfacher, eindimensionaler Arrays  $ar[0]=10;$ar[1]="Hallo"; e.t.c. geht das nämlich auch mit der PHP-Funktion implode().

        Alle Funktionen welche ich Dir genannt habe, machen in der Konsequenz aus einem Array eine Zeichenkette. Das ist was Du brauchst. (In einigen Fällen wirst Du Dich noch um so Kleinigkeiten wie Zeilenumbrüche kümmern müssen.)

        Wenn Du programmieren lernen willst - und lernst gerade die Grundschritte - dann wirst Du auch selbst mal was programmieren müssen und nicht nur die für Deine Zwecke ungeeigneten Beispiele abschreiben. Schau wenigstens bei php.net nach, was die Dir genannten Funktionen machen und wie diese das tun. Wenn Du das nicht willst, dann wirst Du jemanden für die Arbeit bezahlen müssen.

        Denn nur in Ausnahmefällen, also wenn das Problem für mich(!) interessant ist, dann tippe ich hier gerne auch Programmcode, also fertige Lösungen. Aber gewiss nicht bei solchen trivialen Aufgabestellungen. Und ganz gewiss nicht bei solchen nichtssagenden Problembeschreibungen.

        Fred

        1. Warum mögen viele hier im Forum keine Fragen stellen?

          Ich habe übrigens nicht erwartet dass du mir Code schreibst. Ich habe nur eine php-Funktion gesucht die Arrays formatiert in eine Datei ausgeben kann. Wenn es die nicht gibt, ok. Ich habe ja auch geschrieben dass ich da keine Zeit investieren will erst eine Funktion zu schreiben wenn es die nicht schon gibt.

          Übrigens erzeugt print_r($x, true); ebenfalls eine Zeichenkette. Das ist also nicht das Problem was ich hatte.

          Und klar geht es um mehrdimensionale und, wie ich schon geschrieben habe, viele, im Aufbau verschiedene, Arrays. Sonst bräuchte ich keine übersichtlichere Ansicht.

          Danke!
          Sebastian

          1. Warum mögen viele hier im Forum keine Fragen stellen?

            Ich weiß ja nicht, wo Dein Problem liegt und vor allem nicht was Dir an

            <?php  
            # Name der Datei:  
            $LogfileName='/tmp/log' . str_replace('/', '_-_', $_SERVER['REQUEST_URI']) . '_' . date('Y-m-d_H:i:s') . '.txt';  
            $LogVarName='array';  
              
            #Daten für das Beispiel:  
            $array[0]="Hallo Welt!";  
            $array[1]=array("Hallo", "Welt", "!");  
            $array['foo']='bar';  
              
            # Main  
            file_put_contents($LogfileName, print_r($$LogVarName, TRUE));  
              
            #Ausgabe für das Beispiel  
            header ('Content-type: text/plain');  
            print("  
            ==============================  
            Variable: \$$LogVarName  
            Logfile: $LogfileName  
            ==============================  
            " . file_get_contents($LogfileName, print_r($array, TRUE)));  
            ?>
            

            zu kompliziert ist. Das ist das was ich trotz der gegenteiligen Überschrift ("Logfile") aus Deinen Einlassungen errate. Die Lösung Deines Problems ist der "Einzeiler" unter "Main" nebst der Ansicht als Text, die z.B. bei hinreichend geschickter Programmierung auch innerhalb von <pre>-Tags angezeigt werden könnte...

            Alles, was im Beispiel nicht vollkommen trivial ist habe ich nur drin, damit es überhaupt was zu sehen gibt.

            Hinweis:
            Der als Beispiel verwendete Dateiname mit dem Zeitstempel ist auf alten Macs nicht zulässig, die verwenden im Dateisystem den Doppelpunkt als Verzeichnistrenner.

            1. Tach!

              Ich weiß ja nicht, wo Dein Problem liegt und vor allem nicht was Dir an
              [...]
              zu kompliziert ist.

              Das Problem ist doch bereits geklärt. Er hat die Textdatei mit den ihn interessierenden Angaben erstellen können. Allerdings hat er zum Ansehen ein Programm verwendet, das die \n nicht als Zeilenumbrüche anerkannt hat. Das würde ihm auch mit deinem Code passieren. Die Lösung lautet also geeignete Anzeigewerkzeuge zu verwenden oder betriebsystemkonforme Zeilenumbrüche.

              dedlfix.

              1. Das würde ihm auch mit deinem Code passieren.

                Ich hab die Ansicht der Textdatei nicht grundlos in den Browser verlegt :)

                Fred

                1. Tach!

                  Das würde ihm auch mit deinem Code passieren.
                  Ich hab die Ansicht der Textdatei nicht grundlos in den Browser verlegt :)

                  Und welchen Grund hat es, den fetten Browser für ein bisschen Text zu verwenden? Weil man's kann, hmm.

                  dedlfix.

                  1. Tach!

                    Das würde ihm auch mit deinem Code passieren.
                    Ich hab die Ansicht der Textdatei nicht grundlos in den Browser verlegt :)

                    Und welchen Grund hat es, den fetten Browser für ein bisschen Text zu verwenden? Weil man's kann, hmm.

                    Nö. Weil der Browser sowieso schon läuft. Oder glaubst Du der TO testet seine PHP-Skripte in der CLI-Umgebung?

                    1. Tach!

                      Und welchen Grund hat es, den fetten Browser für ein bisschen Text zu verwenden? Weil man's kann, hmm.
                      Nö. Weil der Browser sowieso schon läuft. Oder glaubst Du der TO testet seine PHP-Skripte in der CLI-Umgebung?

                      Ich glaube gar nichts. Wenn er testet, braucht er nicht unbedingt Logfiles, dann kann er sich das Zeug gleich ausgeben lassen. Logfiles nimmt man üblicherweise, wenn man nicht sofort eine Information anschauen kann. Ich finde es dann sinnvoller, ein allgemeines Format zu nehmen, sprich reinen Text, anstatt sich auf ein bestimmtes Ausgabemedium zu spezialisieren. Mit Plain-Text kann er neben dem Browser auch noch andere Programme inklusive CLI-Umgebung verwenden, ohne mindestens ein überflüssiges <pre> drin zu haben.

                      dedlfix.

  2. [latex]Mae  govannen![/latex]

    Gibt es eine Möglichkeit die Formatierung in die log-Datei zu übernehmen damit man es ordentlich lesen kann?

    var_export() vielleicht.

    Stur lächeln und winken, Männer!
    Kai

    --
    It all began when I went on a tour, hoping to find some furniture
     Followed a sign saying "Beautiful Chest", led to a lady who showed me her best)
    SelfHTML-Forum-Stylesheet
    1. Hallo!

      scheint wie wenn dedlfix die Ursache gefunden hat. Kein ordentlicher Windowszeilenumbruch.

      Bin ich nicht drauf gekommen dass das so sein könnte... :)

      Grüße!
      Sebastian

  3. Tach!

    Bei der Ausgabe von Arrays kann ich für den Bildschirm ja mit <pre> und print_r() ein Array gut lesbar ausgeben. Das selbe würde ich gern mit der Datei machen.

    Das <pre> sorgt lediglich dafür, dass der Browser die Zeilenumbrüche und andere Whitespace-Zeichen nicht zu einem einzelnen Leerzeichen zusammenfasst. Eine Datei macht das von sich aus nicht. Du kannst also die print_r()- oder var_dump()-Ausgabe ohne weiteres und ohne Whitespace-Verlust in die Datei schreiben.

    Allerdings hat bisher alles was ich versucht habe nicht geklappt.

    Daraus kann ich nicht entnehmen, was bei dir nicht klappt. Ist es vielleicht so, dass du dir die Datei mit Notepad anschaust, das nur windowspezifische \r\n als Zeilenumbruch korrekt anzeigt? Dann nimm einen Editor, der mit den Unix-\n umgehen kann. Oder ersetze die \n durch \r\n.

    dedlfix.

    1. Hallo!

      Allerdings hat bisher alles was ich versucht habe nicht geklappt.

      Daraus kann ich nicht entnehmen, was bei dir nicht klappt. Ist es vielleicht so, dass du dir die Datei mit Notepad anschaust, das nur windowspezifische \r\n als Zeilenumbruch korrekt anzeigt? Dann nimm einen Editor, der mit den Unix-\n umgehen kann. Oder ersetze die \n durch \r\n.

      Oha... du hast Recht... die Zeilenumbrüche sind offenbar nicht \r\n sondern nur \n. Notepad2 zeigt das wiederum korrekt an.
      Ich glaube ich werde alle \n durch \r\n ersetzen. Das ist vermutlich am Einfachsten.

      Danke für den Hinweis!
      Sebastian

  4. Hello,

    ich habe eine .log-Datei (einfache .txt) erstellt welche ich aus php heraus mit Inhalten fülle. Darunter auch verschiedene Arrays. Die Arrays und auch das log werden zusätzlich auf dem Bildschirm ausgegeben. Bei der Ausgabe von Arrays kann ich für den Bildschirm ja mit <pre> und print_r() ein Array gut lesbar ausgeben. Das selbe würde ich gern mit der Datei machen. Allerdings hat bisher alles was ich versucht habe nicht geklappt. Und ich will auch nicht eine extra Routine schreiben um die Arrays lesbar abzuspeichern da es verschiedene sind und es den Aufwand nicht lohnen würde.

    Daten sollte man in Dateien möglichst immer im Rohformat ablegen, soweit keine wichtigen Gründe dagegen sprechen. Da Du aber eine Datei mit unterschiedlichen Satzarten erzeugen willst, könntest Du entweder die Satzarten kennzeichnen und später bei der Wiederverwendung der Daten entweder die passende Formatanweisung (Typenmaske, Record, Structure, ...) für die Daten oder zusätzlich die Anzeigemaske (HTML-Template) dazu mischen.

    Wenn Du die Daten nicht mehr maschinell auswerten willst, sondern nur noch per Sichtkontrolle, dann könntest Du auch gleich eine HTML-Datei damit erzeugen.

    Die Funktion print_r() könnte Dir dabei aber u. U. trotzdem behilflich sein. Du solltest damit einen String erzeugen lassen (zweites Funktionsargument beachten!), der dann wahlweise in HTML (<pre>) verpackt werden kann, oder aber direkt in der Datei abgelegt werden kann.

    $mein_string = htmlspechialchars(print_r($_mein_array,1));

    echo "<pre>\r\n";
    echo $mein_string . "\r\n";
    echo "</pre>\r\n";

    file_put_contents($mein_dateiname, $mein_string . "\r\n", FILE_APPEND);

    Es bleibt zu beachten, dass ein Array auch Werte enthalten kann, die ihrerseits einen Zeienumbruch enthalten können. Das Satzende wäre dann nicht mehr klar erkennbar.

    Überlege Dir also genau, ob Du mit den Daten nachher - außer einer Sichtkontrolle - noch etwas anfangen willst. Dann wäre diese Art des Wegschreibens nämlich wenig sinnvoll.

    Liebe Grüße aus Bad Driburg

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://restaurant-zur-kleinen-kapelle.de
    1. Hallo Tom,

      Wenn Du die Daten nicht mehr maschinell auswerten willst, sondern nur noch per Sichtkontrolle, dann könntest Du auch gleich eine HTML-Datei damit erzeugen.

      ;) Ok... da hast du Recht... an sowas hab ich gar nicht gedacht...

      Die log-Datei soll wirklich nur zur Übersicht dienen was in der letzten Zeit so passiert ist. Ich habe zwar noch eine log-Tabelle in mysql, aber da schreibe ich nur die wichtigen Sachen rein. Auf dem Bildschirm gebe ich mehr Dinge aus die beschreiben was gerade bearbeitet wird. Und ab und zu, wenn etwas im Verlauf der Bearbeitung hakt, ist es schwer das nur aus der Tabelle herauszulesen. Die alten echos sind aber schon nicht mehr vorhanden, also wollte ich einfach alle relevanten Daten, die ich auf dem Bildschirm ausgebe, zugleich mit in eine Datei schreiben. Die kann ich mir dann anschauen um zu sehen wo das Problem liegt. Und multidimensionale Arrays sind dann schwer zu lesen.

      Aber die html-Datei ist eine gute Lösung... :)

      Danke!
      Sebastian