gcc Log Datei erstellen

  • Ich habe eine Lüftungssteuerung erstellt und schreibe alle relevanten Parameter Zeitabhängig in eine Log Datei
    pFile = fopen ("/home/pi/Log.txt")
    fprint (pFile,"%2,ld,",ptm->tm_mon);................usw.
    nun das Problem ist dass die Datei riesig und unübersichtlich wird irgendwann ist sie auch zu gross.
    Die Frage wie kann ich in ("/home/pi/Log.txt") die variable von Monat und Jahr einbringen, so dass "Log.txt" so aussieht "01Log2013.txt" und jedes Monat eine neue Log angelegt wird

  • Konnte das jetzt nicht testen, aber sollte funktionieren, auch wenns etwas umständlich ist:

    char path[] = "/home/pi/";
    strcat(path, ptm->tm_mon+1);
    strcat(path,"Log");
    strcat(path,ptm->tm_year+1900);
    strcat(path,".txt");

    pFile = fopen (path);

    Edit: Klappt so nicht, siehe korrekte Lösung unten!

    Einmal editiert, zuletzt von xlemmingx (28. September 2013 um 20:02)

  • Du könntest alternativ auch logrotate konfigurieren dass das logfile beim erreichen einer gewissen grösse rotiert bzw gelöscht wird
    Entweder über /etc/logrotate.conf oder du erstellst dir in /etc/logrotate.d/ eine eigene Konfigurationsdatei

    Eine weitere Alternative wäre vielleicht auch die gesammelten Daten in eine SQLite Datenbank abzulegen, das müsste weniger Platz verbrauchen (wobei ich nicht weiss was du überhaupt speicherst) und wenn die Struktur gut durchdacht ist kannst du auch daher gehen und zB alle Einträger über 1000 Datensätzen löschen o.ä.

  • Also die 1. Variante wär schon super da ich ja keine Daten löschen möchte.
    ich habe es soeben mal ausprobiert bekomme aber gleich schon einen Fehler, könnte es sein dass strcat(path,ptm->tm_mon);
    als variable da sie nicht in gänzefüschen ist so nicht akzeptiert wird

    ist es nicht so dass (ptm->tm_mon) ein INT Wert ist und ich einen String benötige????????

    [font="Tahoma, Verdana, Arial, sans-serif"]SQLite wär schon super aber dafür bin ich noch zu schwach:^^:[/font]

    Einmal editiert, zuletzt von ich_probiers (26. September 2013 um 17:06)

  • DANKE

    [font="Tahoma, Verdana, Arial, sans-serif"]char mon[2];[/font]
    Der Weg scheint der richtige zu sein ich bekomme aber immer noch einen Fehler
    kann es sein dass ich mit der Syntax ein Problem habe???

    [font="Tahoma, Verdana, Arial, sans-serif"]sprintf(mon, &(ptm->tm_mon)); incompatible pointer type[/font]

    Einmal editiert, zuletzt von ich_probiers (26. September 2013 um 17:36)

  • Habs mal schnell geschrieben, so funktionierts:

    1 #include <string.h>
    2 #include <time.h>
    3 #include <stdio.h>
    4
    5 int main(){
    6 char path[128];
    7 char mon[2], year[4];
    8 time_t t;
    9 struct tm *ptm;

    10 t = time(NULL);
    11 ptm = localtime(&t);

    12 strcat(path,"/home/pi/");
    13 sprintf(mon, "%d",(ptm->tm_mon+1));
    15 strcat(path, mon);
    16 strcat(path,"Log");
    17 sprintf(year,"%d",(ptm->tm_year+1900));
    18 strcat(path,year);
    19 strcat(path,".txt");
    20
    21 printf(path);
    22 }

    Einmal editiert, zuletzt von xlemmingx (26. September 2013 um 17:54)

  • :bravo2::bravo2::bravo2::bravo2::bravo2::bravo2:
    Nochmals Danke für die Super Arbeit
    [font="Tahoma, Verdana, Arial, sans-serif"]7 char mon[2], year[4]; muss [3] und [5] sein wegen dem \0[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]jetzt habe ich aber noch eine Frage[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]wie lehre ich den String in path sodass er beim nächsten Durchlauf neu geschrieben wird.[/font]
    [font="Tahoma, Verdana, Arial, sans-serif"]er befindet sich nämlich in einer endlosschlaufe [/font]
    :s
    :s
    :s

    Einmal editiert, zuletzt von ich_probiers (27. September 2013 um 14:40)

  • Hi,

    mal eine Frage: wieso willst Du das char-array zurücksetzen? Wenn es eh immer wieder neu initialisiert wird, dann brauchst Du es nicht "löschen" ...

    Zudem: Tipp von mir - schau Dir mal syslog an. Damit schreibts Du Deine Einträge nach /var/log/syslog, brauchst Dich um Datum, Uhrzeit etc. nicht kümmern, weil Dir der Logdaemon das abnimmt und Du brauchst Dir auch um irgendwelche Loggrössen keinen Kopf machen, weil Dir das Logsystem das ebenfalls abnimmt. Das Ganze ist watschneinfach und imho die komfortabelste Art Logging zu realisieren.

    xlemmingx:

    Solche Sachen:

    bitte nochmals editieren und als fehlerhaft kennzeichnen (und damit meine ich nicht nur den strcat mit integer Variablen sondern das gesamte Konstrukt), sonst kommt noch jemand auf die Idee das nachzumachen.

    cu,
    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!