2009-02-17 6 views
7

Ich habe ein Problem mit der Protokollierung zur Ausgabe von einem automatisierten Build.Wie protokolliert man make output ohne Pufferung von stdout und stderr

Der Build ist mit einem Makefile und dem Makefile-Dienstprogramm abgeschlossen.

Das Problem ist, dass normale Ausgabe wie Compiler-Befehlszeilen zu stdout gehen und Fehler kompilieren zu stderr gehen.

Ich möchte die Ausgabe aus dem Build erhalten, wie es auf dem Bildschirm angezeigt würde. So etwas wie:

(stdout) CC -c file.cpp 
(stderr) Compile error at file.cpp line 232, blah blah blah 
(stdout) CC -c file2.cpp 

Was ich versucht (von KSH-Skript) ist:

make -k> build.log 2> build.log

Dies resultiert in einer einzigen Protokolldatei aber Das Problem besteht darin, dass die Streams gepuffert sind und das Ergebnis in der Protokolldatei daher durcheinander ist.

Ich könnte die Ausgabe in 2 separate Protokolldateien erfassen, aber dann hätte ich keine Informationen darüber, wie Sie sie wieder in einer einzigen Protokolldatei zusammenkleben.

Gibt es eine Möglichkeit, in diesem Fall die Pufferung für stdout und stderr zu deaktivieren?

Antwort

22
make -k > build.log 2>&1 

Versuchen Sie Dies sollte besser funktionieren, weil es stderr und stdout wird nicht separat Umleitung, aber stderr nach stdout umgeleitet, die die Puffer sync up machen sollte.

Wenn Sie in einer Datei als ausdrucken sowie die Anmeldung an der Konsole:

make -k 2>&1 | tee build.log 
+0

Hallo Ryan, es funktioniert wie ein Charme, aber ich habe eine Frage, wie man beide Meldungen protokolliert und sieht, um Zeit zu machen? Ihr Befehl protokolliert nur die Nachricht. Danke –

+1

@LoiDang aktualisiert, um eine Alternative hinzuzufügen, die sowohl eine Datei als auch die Konsole ausführt. –

4

diese

make -k > build.log 2>&1 
-1

setbuf (stdout, NULL); -> schaltet die stdout-Pufferung aus