![]() |
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. |
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 |
AW: Frage zu C (Linux Programmierung)
Gibt stderr auch den Zeitstempel an?
|
AW: Frage zu C (Linux Programmierung)
Zitat:
Automatisch wird dort kein Zeitstempel hinzugefügt. Grüße Klaus |
AW: Frage zu C (Linux Programmierung)
Ok danke. Ich habe jetzt eine Funktion gefunden, die einen Fehler in einer log Datei mit Zeitstempel schreibt.
|
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:
oder
WriteLn(LogFile, DateTimeToStr(Now), Text);
Delphi-Quellcode:
Oder alles mit "Datei", einmal AssignFile gegen eine Datei oder als Datei STDERR oder STDOUT verwenden.
WriteLn(Text);
|
AW: Frage zu C (Linux Programmierung)
Ich habe das genutzt:
Code:
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?
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)); } @himitsu: WriteLn ist Delphi (Pascal) |
AW: Frage zu C (Linux Programmierung)
Zitat:
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... |
AW: Frage zu C (Linux Programmierung)
Das würde dann so gehen:
Code:
und dann in linux die software so starten:
fprintf( stderr, "Text" );
Code:
Es würde dann nur noch der Zeitstempel fehlen.
programm 2> Datei.txt
|
AW: Frage zu C (Linux Programmierung)
Hallo,
Zeitstempel steht weiter oben schon
Delphi-Quellcode:
oder halt gleich so
fprintf(fpError, "%s: %s\r\n", getTimestamp(), logBuf);
Delphi-Quellcode:
fprintf(stderr, "%s: %s\r\n", getTimestamp(), logBuf);
|
AW: Frage zu C (Linux Programmierung)
Hast Recht danke. Dann ist jetzt alles klar. Ich hoffe das klappt so.
|
AW: Frage zu C (Linux Programmierung)
WriteLn ... fprintf ... ist doch alles das Selbe :angle2:
|
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. ![]() Brighty |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz