Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Frage zu C (Linux Programmierung) (https://www.delphipraxis.net/192681-frage-zu-c-linux-programmierung.html)

A.Griffin 10. Mai 2017 13:12

Frage zu C (Linux Programmierung)
 
Ich habe eine C Konsolenanwendung am laufen. Diese Anwendung hat auch eine Konsolen-GUI. Meine Frage: Ich habe in einem Fehlerfall bis jetzt die Fehler mit printf auf die Konsole geschrieben. Dies ist ist in diesem Fall sehr unschön, da die Konsolen-GUI ein Teil der Konsole ja bedeckt und man dadurch bei den Fehlern nicht gut durchblickt. Meine Idee wäre es jetzt die Fehler anstatt auf die Konsole in eine Textdatei zu schreiben. Am besten mit Zeitstempel. Weiß einer von euch wie ich das am besten machen könnte?

Vielen Dank im Voraus.

Klaus01 10. Mai 2017 13:22

AW: Frage zu C (Linux Programmierung)
 
..gib die Fehler doch auf STDERR.
STDERR kannst DU wenn das Programm gestartet wird umleiten (in ein File oder nach dev/null)

Grüße
Klaus

A.Griffin 10. Mai 2017 13:24

AW: Frage zu C (Linux Programmierung)
 
Gibt stderr auch den Zeitstempel an?

Klaus01 10. Mai 2017 13:37

AW: Frage zu C (Linux Programmierung)
 
Zitat:

Zitat von A.Griffin (Beitrag 1370905)
Gibt stderr auch den Zeitstempel an?

stderr gibt die selben Daten aus die du auch auf stdout sehen würdest.
Automatisch wird dort kein Zeitstempel hinzugefügt.

Grüße
Klaus

A.Griffin 10. Mai 2017 13:48

AW: Frage zu C (Linux Programmierung)
 
Ok danke. Ich habe jetzt eine Funktion gefunden, die einen Fehler in einer log Datei mit Zeitstempel schreibt.

himitsu 10. Mai 2017 14:39

AW: Frage zu C (Linux Programmierung)
 
Der Nächste freut sich bestimmt ganz doll, dass du deine Lösung nicht verraten hast, wenn er das selbe Problem hat und diesen Thread irgendwann findet.

PS: WriteLn hat auch einen Parameter für die Datei.
Also einmal mit
Delphi-Quellcode:
WriteLn(LogFile, DateTimeToStr(Now), Text);
oder
Delphi-Quellcode:
WriteLn(Text);
Oder alles mit "Datei", einmal AssignFile gegen eine Datei oder als Datei STDERR oder STDOUT verwenden.

A.Griffin 10. Mai 2017 14:50

AW: Frage zu C (Linux Programmierung)
 
Ich habe das genutzt:

Code:
void
ErrorAdd (const char *str, ...)
{
    FILE *fpError;

    va_list ap;
    char logBuf[256];
    static char oldLogBuf[256];

    archiveFile(LOG_PATH "/" ERROR_LOG_NAME);

    va_start (ap, str);
    vsprintf (logBuf, str, ap);
    va_end (ap);

    if (strcmp(oldLogBuf, logBuf))
    {
        fpError = fopen(LOG_PATH "/" ERROR_LOG_NAME, "ab");
        fprintf(fpError, "%s: %s\r\n", getTimestamp(), logBuf);
        fclose(fpError);
    }
    memcpy(oldLogBuf, logBuf, strlen(logBuf));
}
Ich habe aber jetzt das Problem, dass das nicht threadsicher zu sein scheint und die Software abstürzt, wenn ErrorAdd in einem zweiten Thread genutzt wird. Was kann ich da machen?

@himitsu: WriteLn ist Delphi (Pascal)

jobo 10. Mai 2017 15:43

AW: Frage zu C (Linux Programmierung)
 
Zitat:

Zitat von A.Griffin (Beitrag 1370916)

Ich habe aber jetzt das Problem, dass das nicht threadsicher zu sein scheint und die Software abstürzt, wenn ErrorAdd in einem zweiten Thread genutzt wird. Was kann ich da machen?

also STDERR und STDOUT, wie Klaus vorgeschlagen hat, ist m.E. best practice. So wird es in Linux gehandhabt. Du brauchst es nicht anders zu machen.
So kann der User (z.B. Du während der Entwicklung) entscheiden, wo der Kram hingeht, Dateiumleitung, STDOUT, dev/null, ..

Unter Windows soll es sowas ja auch geben...

A.Griffin 10. Mai 2017 15:49

AW: Frage zu C (Linux Programmierung)
 
Das würde dann so gehen:

Code:
fprintf( stderr, "Text" );
und dann in linux die software so starten:

Code:
programm 2> Datei.txt
Es würde dann nur noch der Zeitstempel fehlen.

hoika 10. Mai 2017 16:02

AW: Frage zu C (Linux Programmierung)
 
Hallo,

Zeitstempel steht weiter oben schon
Delphi-Quellcode:
fprintf(fpError, "%s: %s\r\n", getTimestamp(), logBuf);
oder halt gleich so
Delphi-Quellcode:
fprintf(stderr, "%s: %s\r\n", getTimestamp(), logBuf);

A.Griffin 10. Mai 2017 16:04

AW: Frage zu C (Linux Programmierung)
 
Hast Recht danke. Dann ist jetzt alles klar. Ich hoffe das klappt so.

himitsu 10. Mai 2017 16:36

AW: Frage zu C (Linux Programmierung)
 
WriteLn ... fprintf ... ist doch alles das Selbe :angle2:

BrightAngel 11. Mai 2017 06:28

AW: Frage zu C (Linux Programmierung)
 
Hey!
Auch wenn ich jetzt hinterher komme wie die alte Fasenacht: Es gibt noch eventuell etwas Wichtiges, das du bei in den String integrierten Zeitstempeln berücksichtigen solltest (falls das für deinen Usecase relevant sein sollte, da du ja eine Konsolen UI hast...).
Moderne Linux Distributionen (Stichwort systemd) führen bei Diensten ein Journal über die Ausgabe. Dieses Journal ist sehr einfach für Sysadmins durchsuchbar (über den Befehl "journalctl") und wird automatisiert mit Zeitstempeln versehen. Das nur zur Vollständigkeit halber. Das Journal kann afaik auch log Dateien.

Zudem kam mir noch etwas: Wie meine Vorredner gesagt hatten, ist der Standardweg tatsächlich über stderr, wenn man Fehler reportet. Wenn dir das "gepipe" mit >2 zu doof ist (was sozusagen explizit das Fehlerreporting aus dem Weg räumt), kannst du das auch umgekehrt machen und über einen Startparameter z.B. "-e [optional pfad]" den Fehlerreport explizit zum Anschalten machen (optionaler Pfad: wenn Pfad fehlt, werden Fehler nach stderr weitergeleitet)

Und dann gibt es für die Ausgabe grundsätzlich noch die Möglichkeit herauszufinden, ob es sich bei stderr um eine Konsole handelt (mit z.B. isatty). Du könntest dann die Fehler dann grafisch über deine UI ausgeben :)

Brighty


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz