2009-12-14 4 views
23

Erstellen Ich habe einige Code wie folgt aus:EventLog.CreateEventSource ist keine benutzerdefinierte Protokoll

EventLog.CreateEventSource("myApp", "myAppLog"); 
EventLog.WriteEntry("myApp", "Test log message", EventLogEntryType.Error); 

Nun, es sei denn ich etwas fehle MSDN gelesen zu haben, sollte dies ein neues Protokoll führen ‚myAppLog‘ erstellt werden In der Ereignisanzeige sollte dem neuen Protokoll ein Eintrag mit dem Quellennamen 'myApp' hinzugefügt werden. Aber ich kann das neue Protokoll nicht erstellen. Dies schreibt immer nur eine Fehlerprotokollnachricht in das Anwendungsprotokoll, wobei die Quelle "myApp" - "myAppLog" nirgendwo zu sehen ist. Was mache ich falsch? Ich bin als Administrator angemeldet.

Antwort

38

Ist es möglich, dass Sie beim Schreiben in das Standard-Anwendungsprotokoll bereits die Quelle "myApp" verwendet haben? Wenn dies der Fall nach MSDN:

Wenn eine Quelle bereits auf ein Protokoll kartiert und Sie neu zuordnen es in ein neues Protokoll, müssen Sie den Computer neu starten, damit die Änderungen wirksam werden. aus diesem

http://msdn.microsoft.com/en-us/library/2awhba7a.aspx (etwa auf halbem Weg nach unten auf der Seite)

+1

Das war im Grunde mein Problem. Windows-Ereignisprotokoll ist ein wenig verrückt, da es möglicherweise nicht ordnungsgemäß funktioniert, wenn Sie das erste Mal in ein neues benutzerdefiniertes Protokoll schreiben, bis Sie den Computer neu starten. Ich habe es erstellt das Protokoll, aber es war immer noch Schreiben von Nachrichten sowohl in das neue benutzerdefinierte Protokoll und das Anwendungsprotokoll in der Ereignisanzeige, bis ich den Rechner neu gestartet. Danach wurden neue Nachrichten in meinem neuen benutzerdefinierten Protokoll protokolliert. Vielen Dank! – Jez

+0

Nach einer Weile des Debuggens habe ich neu gestartet. Das hat funktioniert! – jonas

+0

Neustart von EventViewer half in meinem Fall auf Win8. – Legends

0

Haben Sie die Quelle auf Ihrem EventLog festgelegt?

Von MSDN Article.

Sie müssen die Source-Eigenschaft in Ihrer EventLog-Komponenteninstanz festlegen, bevor Sie Einträge in ein Protokoll schreiben können. Wenn Ihre Komponente einen Eintrag schreibt, prüft das System automatisch, ob die von Ihnen angegebene Quelle im Ereignisprotokoll registriert ist, in das die Komponente schreibt, und ruft bei Bedarf CreateEventSource auf. Im Allgemeinen erstellen Sie die neue Ereignisquelle während der Installation Ihrer Anwendung. Dies ermöglicht dem Betriebssystem, die Liste der registrierten Ereignisquellen und deren Konfiguration zu aktualisieren. Wenn das Betriebssystem seine Liste der Ereignisquellen nicht aktualisiert hat und Sie versuchen, ein Ereignis mit der neuen Quelle zu schreiben, schlägt die Schreiboperation fehl. Wenn das Erstellen der Quelle während der Installation keine Option ist, versuchen Sie, die Quelle weit vor der ersten Schreiboperation zu erstellen, möglicherweise während der Anwendungsinitialisierung. Wenn Sie diesen Ansatz wählen, müssen Sie sicherstellen, dass der Initialisierungscode mit Administratorrechten auf dem Computer ausgeführt wird. Diese Rechte sind erforderlich, um neue Ereignisquellen zu erstellen.

+0

Das gilt nur, wenn Sie eine Instanz eines EventLog erstellen. Da ich die statische WriteEntry-Methode verwende, wird die Quelle als erstes String-Argument übergeben. – Jez

4

Möglicherweise vergessen Sie, die Source-Eigenschaft in Ihrem EventLog festzulegen.

Es sollte wie folgt aussehen:

 if(!EventLog.SourceExists("MySource")) 
     { 
      EventLog.CreateEventSource("MySource", "MyNewLog"); 
     } 

     EventLog myLog = new EventLog(); 
     myLog.Source = "MySource"; 

     myLog.WriteEntry("Writing to event log."); 

Hier ist die MSDN article Referenz.

+0

Derselbe Fehler wie eine andere Antwort. :-) Ich verwende keine Instanz von EventLog; Ich verwende die statische WriteEntry-Methode, dies gilt nicht. – Jez

+1

@Jez Wenn Sie die EventSource im laufenden Betrieb erstellen, müssen Sie berücksichtigen, dass beim Erstellen der EventSource eine Latenz auftritt, sodass sie nicht sofort verfügbar wird. Wenn Sie Ihr Programm zweimal ausführen, fängt es an, an die richtige Quelle zu schreiben? – Joseph

5

Ich habe gerade einen wenig Code, mir zu helfen geschrieben. Quelle, die in einem anderen Protokoll-Problem registriert wurde, das ich entdeckt habe und die Quellen nicht manuell aus den Protokollen entfernen möchte. Ich entschied mich zu prüfen, ob die Quelle vorhanden ist, ob sie überprüft, ob sie mit dem richtigen Protokoll verknüpft ist, ob sie die Quelle nicht löscht, jetzt, wo sie nicht existiert, oder nie das Protokoll neu erstellt hat .

protected const string EventLogName = "MyLog"; 

private static bool CheckSourceExists(string source) { 
    if (EventLog.SourceExists(source)) { 
    EventLog evLog = new EventLog {Source = source}; 
    if (evLog.Log != EventLogName) { 
     EventLog.DeleteEventSource(source); 
    } 
    } 

    if (!EventLog.SourceExists(source)) { 
    EventLog.CreateEventSource(source, EventLogName); 
    EventLog.WriteEntry(source, String.Format("Event Log Created '{0}'/'{1}'", EventLogName, source), EventLogEntryType.Information); 
    } 

    return EventLog.SourceExists(source); 
} 

public static void WriteEventToMyLog(string source, string text, EventLogEntryType type) {  
    if (CheckSourceExists(source)) {   
     EventLog.WriteEntry(source, text, type);   
    } 
} 

Hoffentlich hilft es :)

+0

Das ist ein bisschen CheckSourceExists schwer ... wäre ein Albtraum, wenn das die ganze Zeit machen würde. Warum nicht einmal am Anfang der Ausführung nachschauen und es dabei belassen? – CokoBWare

+0

Ja, du bist genau da, ich glaube, ich habe das in etwas geändert, das ein bisschen mehr war als einmal pro Site Utility. Die Anforderung von Administratorberechtigungen (oder bestimmten Ereignisprotokollberechtigungen) zum Erstellen der Quellen war ebenfalls ein Motivator. – PJUK

0

Wenn Sie alle Vorschläge in anderen Antworten überprüft haben, dann die folgende

lesen

Von MSDN

Das Betriebssystem speichert Ereignisprotokolle als Dateien . Wenn Sie EventLogInstaller oder CreateEventSource zum Erstellen eines neuen Ereignisprotokolls verwenden, wird die zugehörige Datei im Verzeichnis% SystemRoot% \ System32 \ Config auf dem angegebenen Computer gespeichert. Der Dateiname wird festgelegt, indem die ersten 8 Zeichen der Log-Eigenschaft mit der Dateinamenerweiterung ".evt" angehängt werden.

Vergewissern Sie sich, dass die ersten 8 Zeichen einzigartig sind.

0

Grundsätzlich ist die einfachste Lösung, dass Sie Ihr Visual Studio schließen und als Administrator-Modus ausführen müssen. Dann könnten Sie diesen Fehler beheben

Verwandte Themen