2008-10-10 7 views
11

Wo würden Sie eine Fehlerprotokolldatei schreiben, sagen ErrorLog.txt in Windows? Beachten Sie, dass der Pfad für grundlegende Benutzer für Dateischreibberechtigungen geöffnet sein muss.Wo sind die besten Orte, um ein Fehlerprotokoll in Windows zu schreiben?

Ich weiß, das Eventlog ist ein möglicher Ort für Schreibfehler, aber funktioniert es für "Benutzer" -Ebene Berechtigungen?

BEARBEITEN: Ich ziele auf Windows 2003, aber ich stellte die Frage in einer Weise, um eine "Allgemeine Richtlinie" für wo Fehlerprotokolle zu schreiben.
Wie für das EventLog hatte ich Probleme zuvor in einer ASP.NET-Anwendung, wo ich im Windows-Ereignisprotokoll protokollieren wollte, aber ich hatte Sicherheitsprobleme, die mir Kummer bereiten. (Ich erinnere mich nicht an die Probleme, die ich hatte, aber erinnere dich daran, sie zu haben.)

+0

Können Sie genauer über die Art des Programms oder der Art sein Fehler, die Sie protokollieren möchten. Wie wichtig sind die Fehler auf lange Sicht. (z. B. Webserver?) –

+0

Es wäre nützlich zu wissen, mit welcher Technologie und mit welcher Version des Betriebssystems Sie arbeiten. :) –

Antwort

14

Haben Sie in Erwägung gezogen, stattdessen die Ereignisanzeige zu protokollieren? Wenn Sie Ihr eigenes Protokoll schreiben möchten, empfehle ich das Einstellungsverzeichnis für lokale Benutzer. Erstellen Sie ein Produktverzeichnis unter dort. Bei verschiedenen Windows-Versionen ist das anders.

Unter Vista können Sie solche Dateien nicht unter c: \ program files ablegen. Sie werden viele Probleme damit bekommen.

In .NET können Sie diesen Ordner mit diesem herausfinden:

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) 

und das Ereignisprotokoll ist recht einfach zu verwenden:

http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

+0

Das App Einstellungsverzeichnis ist ein guter Ort. Einfacher Zugriff auf .net WinForms, ohne zusätzliche Munging, über statische Eigenschaften auf Ihrem Application-Objekt (.CommonAppDataPath, .LocalUserAppDataPath, etc.) –

+0

Das Problem mit der Verwendung der App Einstellungsordner ist, dass die meisten Zeit Protokolldateien manuell in Notepad geöffnet werden für Explorer, was bedeutet, dass der Benutzer dafür graben muss. –

+1

In der Regel biete ich einen Mechanismus über die Benutzeroberfläche an, um die Protokolldatei direkt zu öffnen. Und Ihre Software funktioniert immer, also wann müssen sie sich das Protokoll ansehen, oder? ;) –

0

% TEMP% ist immer ein guter Ort für Protokolle, die ich finde.

+0

Wenn die Protokolle langfristig relativ unwichtig sind, würde ich zustimmen Temp ist das Richtige. –

-5

Legen Sie es in das Verzeichnis der Anwendung. Die Benutzer benötigen Zugriff auf den Ordner, um die Anwendung auszuführen und auszuführen, und Sie können den Schreibzugriff beim Start der Anwendung überprüfen.

Das Ereignisprotokoll ist ein Problem bei der Fehlersuche, aber Sie sollten dort immer noch erhebliche Fehler posten.

BEARBEITEN - Wenn Sie .NET verwenden, sollten Sie sich die MS Application Blocks für die Protokollierung ansehen. Sie machen das Leben wirklich leicht.

Jeez Karma-Killer. Das nächste Mal werde ich nicht einmal einen Vorschlag machen, wenn das Poster einen unvollständigen Beitrag ausstellt.

+0

Anwendungsprotokolle sollten nicht im Anwendungsverzeichnis abgelegt werden. In einer sicheren Umgebung haben Nicht-Administratoren keinen Schreibzugriff. –

+0

Das Einfügen einer Protokolldatei in das Verzeichnis, in dem die App installiert ist, ist eine * BAD * * BAD * Idee. Ich kann das nicht stark genug wiederholen. Ein Benutzer unter Vista kann möglicherweise eine App ausführen, aber sie können (und sollten NICHT in der Lage sein) in das App-Verzeichnis in% PROGRAMFILES% – Rob

+0

Keine Option für Programme unter Vista und eine schlechte Idee zu schreiben Allgemeines. Vista erlaubt es dem Programm nicht, Dateien in "Programme" zu erstellen. Wenn die App dort installiert ist, schlägt die Protokollierung daher drastisch fehl. – workmad3

3

Persönlich würde ich vorschlagen, mit das Windows-Ereignisprotokoll, es ist großartig. Wenn nicht, schreiben Sie die Datei in das Verzeichnis ApplicationData oder in das Verzeichnis ProgramData (Anwendungsdaten für alle Benutzer in Windows XP).

2

Die Standard-Standort (en) sind:

C:\Documents and Settings\All Users\Application Data\MyApp 

oder

C:\Documents and Settings\%Username%\Application Data\MyApp 

(aka %UserProfile%\Application Data\MyApp), die Ihre Benutzerebene Erlaubnis Anforderung entsprechen würde. Es trennt auch Protokolle, die von verschiedenen Benutzern erstellt wurden.

Mit .

von
AppDir= 
    System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) 

oder

AppDir= 
    System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

gefolgt: NET Laufzeit, können diese als gebaut werden

MyAppDir = IO.Path.Combine(AppDir,'MyApp') 

(Welche hoffentlich Karten Vista Profile auch).

+0

Das ist nicht richtig für Vista - (besser zu benutzen.NET Environment Klasse, oder etwas, das den richtigen Anruf in der von Ihnen verwendeten Sprache umschließt) –

2

Das Windows-Ereignisprotokoll ist definitiv der Weg zur Protokollierung von Fehlern. Sie sind nicht auf das Protokoll "Anwendung" beschränkt, da es möglich ist, ein neues Protokollziel zu erstellen (z. B. "Meine Anwendung"). Dies muss möglicherweise im Rahmen der Einrichtung durchgeführt werden, da ich nicht sicher bin, ob dafür Administratorrechte erforderlich sind oder nicht. Es gibt ein Microsoft-Beispiel in C# unter http://support.microsoft.com/kb/307024.

Windows 2008 hat auch Event Log Forwarding, die mit Server-Anwendungen ziemlich handlich sein kann.

+0

Erstellen Sie eine neue "Event Source" (Text in einem Feld) in einem vorhandenen Protokoll erfordert Admin-Berechtigungen, so dass ich die Erstellung eines übernehmen müsste Das neue Log (eine komplett neue Datei) würde ebenfalls Administratorrechte erfordern. –

+0

Dies war das "Problem", das ich zuvor hatte, Administratorrechte erforderlich, damit die Webanwendung das Protokoll im Windows-Ereignisprotokoll erstellt. –

0

Gegen den Strich hier - es hängt davon ab, was Sie tun müssen. Manchmal müssen Sie die Ergebnisse manipulieren, also ist log.txt der richtige Weg. Es ist einfach, änderbar und einfach zu suchen.

Nehmen Sie ein Beispiel von Joel. Fogbugz sendet ein Log/Dump von Fehlermeldungen per HTTP an ihren Server. Sie können dasselbe tun und müssen sich nicht um die Zugriffsrechte des Benutzers auf dem Laufwerk kümmern.

5

Textdateien eignen sich hervorragend für eine Serveranwendung (Windows 2003). Sie sollten eine separate Protokolldatei für jede Serveranwendung haben. Der Standort ist eine Frage der Konvention, um mit den Administratoren übereinzustimmen. Z.B. Für ASP.NET-Apps habe ich sie oft auf einer separaten Festplatte von der Anwendung unter einer Ordnerstruktur platziert, die die virtuelle Verzeichnisstruktur nachahmt.

Für Client-Anwendungen besteht ein Nachteil von Textdateien darin, dass ein Benutzer mehrere Kopien Ihrer Anwendung starten kann (es sei denn, Sie haben bestimmte Schritte unternommen, um dies zu verhindern). Sie haben also das Problem der Konkurrenz, wenn mehrere Instanzen versuchen, in dieselbe Protokolldatei zu schreiben. Aus diesem Grund würde ich immer das Windows Event Log für Client-Apps bevorzugen. Ein Nachteil besteht darin, dass Sie ein Administrator sein müssen, um ein Ereignisprotokoll zu erstellen - dies kann z. durch das Setup-Paket.

Wenn Sie eine Datei verwenden, würde ich vorschlagen, den Ordner Environment.SpecialFolder zu verwenden. Local ApplicationData anstelle von SpecialFolder.ApplicationData wie von anderen vorgeschlagen. LocalApplicationData befindet sich auf der lokalen Festplatte: Sie möchten nicht, dass Netzwerkprobleme die Protokollierung verhindern, wenn der Benutzer über ein servergespeichertes Profil verfügt. Verwenden Sie für eine WinForms-Anwendung Application.LocalUserAppDataPath.

In beiden Fällen würde ich eine Konfigurationsdatei verwenden, um zu entscheiden, wo die Protokollierung erfolgen soll, damit Sie sie problemlos ändern können. Z.B. Wenn Sie Log4Net oder ein ähnliches Framework verwenden, können Sie problemlos konfigurieren, ob Sie in einer Textdatei, in einem Ereignisprotokoll oder an einer anderen Stelle (z. B. einer Datenbank) anmelden möchten, ohne die App zu ändern.

1

Ich stimme Lou zu, aber ich bevorzuge es, dies in einer Konfigurationsdatei wie Joe sagte. Sie können

Datei value = "$ {} APPDATA /Test/log-file.txt"

verwenden ("Test" könnte sein, was Sie wollen, oder ganz entfernt) in der Konfigurationsdatei, die bewirkt, dass die Protokolldatei zum Schreiben nach "/ Dokumente und Einstellungen/LoginUser/Application Daten/Test" unter Windows XP und nach "/ Benutzer/LoginUser/AppData/Roaming/Test unter Windows Vista.Das funktioniert, wie sie ist mit Windows-Anwendungen

Ich füge nur dies, wie ich viel zu viel Zeit nur verbracht herauszufinden, wie man diese Arbeit unter Windows Vista ...

zu machen. So verwenden Sie die Protokollierung in Web-Anwendungen, fand ich Phil Haack Blog-Eintrag auf diesem eine große Ressource sein: http://haacked.com/archive/2005/03/07/ConfiguringLog4NetForWebApplications.aspx

0

ich persönlich nicht mag das Windows-Ereignisprotokoll verwenden, wo ich jetzt bin, weil wir keinen Zugang zu den Produktionsservern, so dass wir jedes Mal Zugriff anfordern müssten, wenn wir die Fehler betrachten wollten. Es ist leider kein schneller Prozess, daher wird Ihre Fehlersuche durch das Warten auf jemand anderen vollendet. Ich mag es auch nicht, dass sie sich innerhalb der anderen Anwendungen verlieren. Sicher, Sie können sortieren, aber es ist nur ein bisschen eine Nuance Scrollen nach unten. Was Sie verwenden, wird am Ende eine Kombination aus persönlichen Vorlieben gekoppelt mit Einschränkungen der Umgebung sein, in der Sie arbeiten. (Log-Datei, Ereignisprotokoll oder Datenbank)