2009-12-14 20 views
23

ho qualche codice come questo:EventLog.CreateEventSource non sta creando un log personalizzato

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

Ora, a meno che mi manca qualcosa dopo aver letto MSDN, questo dovrebbe causare un nuovo registro 'myAppLog' da creare nel visualizzatore di eventi e una voce deve essere aggiunta a quel nuovo registro con il nome di origine "myApp". Ma non riesco a creare il nuovo log. Ciò scrive sempre un messaggio di errore nel registro dell'applicazione, con l'origine "myApp" - "myAppLog" non è visibile da nessuna parte. Che cosa sto facendo di sbagliato? Sono registrato come amministratore.

risposta

38

È possibile che abbia già utilizzato la sorgente "myApp" durante la scrittura nel registro dell'applicazione standard? Se è così secondo il MSDN:

Se una sorgente è già stato mappato un tronco e si rimappare a un nuovo registro, è necessario riavviare il computer affinché le modifiche abbiano effetto.

http://msdn.microsoft.com/en-us/library/2awhba7a.aspx (circa a metà strada in basso nella pagina)

+1

Questo era fondamentalmente il mio problema. Il registro eventi di Windows è un po 'impreciso in quanto potrebbe non funzionare correttamente se è la prima volta che si scrive su un nuovo log personalizzato fino a quando non si riavvia la macchina. L'ho creato creando il log, ma stava ancora scrivendo messaggi sia sul nuovo registro personalizzato che sul registro dell'applicazione nel Viewer degli eventi, fino a quando non ho riavviato la macchina. Successivamente, i nuovi messaggi sono appena stati registrati nel mio nuovo log personalizzato. Grazie! – Jez

+0

Dopo un po 'di debug mi sono riavviato. Ha funzionato! – jonas

+0

Il riavvio di EventViewer ha aiutato nel mio caso su Win8. – Legends

0

Hai impostato la sorgente sul tuo EventLog?

Da MSDN Article.

È necessario impostare la proprietà Origine sull'istanza del componente EventLog prima di poter scrivere le voci in un registro. Quando il componente scrive una voce, il sistema verifica automaticamente se l'origine specificata è registrata nel registro eventi in cui il componente è in scrittura e chiama CreateEventSource se necessario. In generale, creare la nuova origine evento durante l'installazione dell'applicazione. Ciò consente al sistema operativo di aggiornare la propria lista di sorgenti di eventi registrati e la loro configurazione. Se il sistema operativo non ha aggiornato il proprio elenco di origini evento e si tenta di scrivere un evento con la nuova sorgente, l'operazione di scrittura avrà esito negativo. Se la creazione dell'origine durante l'installazione non è un'opzione, provare a creare l'origine ben prima della prima operazione di scrittura, forse durante l'inizializzazione dell'applicazione. Se scegli questo approccio, assicurati che il codice di inizializzazione sia in esecuzione con i diritti di amministratore sul computer. Questi diritti sono necessari per la creazione di nuove fonti di eventi.

+0

Questo si applica solo se stai creando un'istanza di un EventLog. Poiché sto utilizzando il metodo WriteEntry statico, l'origine viene passata come primo argomento di stringa. – Jez

4

si potrebbe essere dimenticando per impostare la proprietà Source sul EventLog.

dovrebbe apparire qualcosa di simile:

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

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

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

Ecco il MSDN article per riferimento.

+0

Lo stesso errore di un'altra risposta. :-) Non sto usando un'istanza di EventLog; Sto usando il metodo WriteEntry statico, quindi questo non si applica. – Jez

+1

@Jez se stai creando l'EventSource al volo devi tenere presente che c'è una latenza nella creazione di EventSource, quindi non diventerà immediatamente disponibile. Se esegui il programma sei volte, inizia a scrivere sulla fonte corretta? – Joseph

5

ho appena scritto un po 'di codice per aiutarmi a uscire da questa. fonte registrata in un altro problema di registro che ho riscontrato e non voglio manualmente rimuovere i sorgenti dai log. Quello che ho deciso di fare è stato controllare se la fonte esiste, se controlla che sia collegata al log corretto, se non è eliminare la sorgente, ora che non esiste o f non ha mai creato il Log nuovo di zecca .

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);   
    } 
} 

Speriamo che aiuta :)

+0

Questo è un po 'di CheckSourceExists pesante ... sarebbe un incubo se lo stesse facendo sempre. Perché non controllarlo una volta all'inizio dell'esecuzione e lasciarlo? – CokoBWare

+0

Sì, hai ragione, penso di aver finito per ridirigerlo in qualcosa che era un po 'più di una volta per ogni utilità del sito. Anche il requisito delle autorizzazioni di amministratore (o delle autorizzazioni specifiche del registro degli eventi) per creare le fonti era un fattore motivante. – PJUK

0

Se dopo aver verificato tutti i suggerimenti di altre risposte, quindi leggere le seguenti

Da MSDN

I negozi del sistema operativo registri eventi come file . Quando si utilizza EventLogInstaller o CreateEventSource per creare un nuovo registro eventi, il file associato viene memorizzato nella directory% SystemRoot% \ System32 \ Config sul computer specificato. Il nome del file viene impostato aggiungendo i primi 8 caratteri della proprietà Log con l'estensione del nome file ".evt".

Assicurarsi che i primi 8 caratteri siano univoci.

0

Fondamentalmente, la soluzione più semplice è chiudere lo studio visivo ed eseguire la modalità amministratore. Quindi, potresti risolvere questo errore

Problemi correlati