Verfasst am: 18.10.2011, 07:46
Titel: Fehlerausgabe im Logfile aber nicht im Command Window
Hey Leute,
vielleicht kann mir ja doch jemand helfen, denn ich wiedermal nicht weiter komme.
Ich will eigentlich nur, falls welche auftreten sollten, die Fehlermeldungen in ein Logfile schreiben lassen. Mit diary on und off werden ja meine ganzen Befehle und Ausgaben ins Logfile geschrieben, wenn ich in meinen Quellcode das Simikolon weglasse. Das will ich aber nur ungern, da das Logfile dann verdammt lang wird.
Gibt es da irgendeinen "Trick" bzw. eine Möglichkeit dafür?
DIARY selber is built-in und man kann es daher nicht modifizieren. Auch sonst kenne ich keinen guten Trick. Etwas advanced wäre mit LASTERR und timer objects zu arbeiteten. Vermutlich aber zu viel Aufstand.
Verfasst am: 18.10.2011, 10:10
Titel: Re: Fehlerausgabe im Logfile aber nicht im Command Window
Hallo Chillson,
Man kann DIARY modifizieren, obwohl es built-in ist: Wenn man ein M-File mit dem Namen "diary.m" im Matlab-Pfad hat, wird es auch aufgerufen - zumindest in modernen Matlab Versionen. In Matlab 6.5 hatten duie built-in Funktionen noch einen höhere Precedence als die M-Files.
Eine Modifikation würde aber nicht viel bringen, weil man immer noch sehr viel Aufwand betreiben müßte, um die Fehlermeldungen von den Standard-Ausgaben zu unterscheiden. Viel einfacher ist es, ERROR zu modifizieren. Dabei würde ich auf keinen Fall ein M-File mit Namen "error.m" erzeugen. Denn wenn darin ein Fehler ist, ruft es sich selbst rekursive auf, was sehr unpraktisch ist... Aber soetwas geht ganz gut:
Code:
function myError(Caller, Msg)
FID = fopen('D:\myError.log', 'a');
if FID < 0, error('Cannot openlog file.'); end fprintf(FID, '*** %s: %s\n', Caller, Msg);
fprintf(2, '*** %s: %s\n', Caller, Msg); % Red font in CommanWindow fclose(FID);
Nun werden die Meldungen in ein eigenes File umgeleitet. Wahlweise kann man nach der Ausgaben auch die Meldung an Matlab's ERROR weitergeben. Auch unerwartete Fehler lassen sich abfangen:
Code:
try ...% your code catch ME
myError(mfilename, ME.message);
end
Das läßt sich beliebig ausfeilen. Ich benutze eine PERSISTENT-Variable in meiner Fehler-Routine, die eine Liste mit Files enthält, in die geloggt werden soll. Wenn die Liste leer ist, wird nur ins Command-Window geschrieben. Zusätzlich gibt es noch ein Flag zur Unterscheidung von ernsten, behebbaren und unerwarteten Fehlern. Und natürlich einen Warnton.
Hätte dann doch nochmal was anderes.
Es muss doch auch möglich sein, mit dem Diary Befehl, alle Ausgaben in ein Logfile zu schrieben, jedoch das nichts im Command Window angezeigt wird!?
Das geht zwar, man muss dazu aber undokumentierte Java-Funktionen für das Schreiben ins Command-Window ändern. Das würde ich selbst auf keinen Fall tun! Damit verliert man nämlcih den Überblick, wenn unerwartete Fehler oder Warnungen auftreten.
Wenn man wirklich etwas in ein Log-File schreiben möchte, das nicht im Command-Window erscheint, is ein einfaches FPRINTF sicherer und direkter.
mein logfile hat den namen LOGFILFE, sprich: LOGFILE= C:\logfile.txt und mit diary(LOGFILE) lass ich mir jetzt die zeilen in mein logfile schreiben, hinter denen ich das semikolon weglasse.
und wie soll das jetzt mit fprintf funktionieren?
kann ich ihm dann auch noch genau sagen, welche zeilen er in mein logfile schrieben soll?
Wenn Du DIARY verwendest, wird alles, was im Command-Window auftaucht auch in das DIARY-File geschrieben. Das kann nützlich oder lästig sein. Da es mir hauptsächlich lästig ist, verwende ich eine Unterfunktion, die alle Ausgaben in ein Log-File schreibt, ohne DIARY zu benutzen:
Das läßt sich natürlich noch beliebig ausfeilen, z.B. dass man die Nachricht zusätzlich noch ins Command-Window schreibt, mehrer Files öffnen kann, Mitteilungen, Warnung und Errors speziell behandelt, etc.
Dabne erstmal für deine Mühe! Doch ich muss zugeben, dass ich nich der absolute pro in matlab bin und daher immer noch nich ganz durchblicke... Hast du villt Zeit n paar Kommentare hinter die einzelnen Befehle/Zeilen zu schreiben damit ich weiß was das alles zu bedeuten hat?
Du kannst zu jedem einzelnen Befehl per "help" sehr gute Erkärungen bekommen und dabei gleichzeitig noch lernen, was man sonst noch damit erreichen kann. Das ist gerade für einen Beginner sehr lehrreich.
Ich selbst kann das nicht besser machen.
Gruß, Jan
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.