2010-06-03 4 views
12

Ich habe einen Tag damit verbracht, Ent Lib Logging arbeiten zu lassen und alles in Datenbank oder Ereignisprotokoll zu protokollieren. Ich habe eine Webanwendung und eine Konsolenanwendung mit derselben Ent Lib-Konfiguration, aber nur die Konsolenanwendung kann sich im Ereignisprotokoll anmelden. Ich habe alles mit Berechtigungen versucht, aber ich weiß nicht, was genau ich mache — welche Dienste sollten was haben. Es funktioniert nicht!Enterprise-Bibliothek Protokollierung nicht auf Ereignisprotokoll von ASP.NET protokollieren

Ich lese Artikel wie diese http://imar.spaanjaars.com/275/logging-errors-to-the-event-log-in-aspnet-applications und ich möchte versuchen, dem ASPNET-Konto diese Berechtigungen zu geben. Ich verwende Windows 7 und kann kein ASPNET-Benutzerkonto finden. Also, wo ist es?

Dies ist die Konfigurationsdatei, die automatisch von Ent Lib-Dienstprogramm erzeugt wird, und es funktioniert nur auf App.config, nicht auf web.config

<loggingConfiguration name="Logging Application Block" tracingEnabled="true" 
    defaultCategory="General" logWarningsWhenNoCategoriesMatch="true" 
    revertImpersonation="false"> 
    <listeners> 
     <add source="Logger" formatter="Text Formatter" log="Application" 
     machineName="" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FormattedEventLogTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
     traceOutputOptions="None" filter="All" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FormattedEventLogTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
     name="Formatted EventLog TraceListener" /> 
    </listeners> 
    <formatters> 
     <add template="Timestamp: {timestamp}&#xD;&#xA;Message: {message}&#xD;&#xA;Category: {category}&#xD;&#xA;Priority: {priority}&#xD;&#xA;EventId: {eventid}&#xD;&#xA;Severity: {severity}&#xD;&#xA;Title:{title}&#xD;&#xA;Machine: {machine}&#xD;&#xA;Application Domain: {appDomain}&#xD;&#xA;Process Id: {processId}&#xD;&#xA;Process Name: {processName}&#xD;&#xA;Win32 Thread Id: {win32ThreadId}&#xD;&#xA;Thread Name: {threadName}&#xD;&#xA;Extended Properties: {dictionary({key} - {value}&#xD;&#xA;)}" 
     type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
     name="Text Formatter" /> 
    </formatters> 
    <categorySources> 
     <add switchValue="All" name="General"> 
     <listeners> 
      <add name="Formatted EventLog TraceListener" /> 
     </listeners> 
     </add> 
    </categorySources> 
    <specialSources> 
     <allEvents switchValue="All" name="All Events" /> 
     <notProcessed switchValue="All" name="Unprocessed Category" /> 
     <errors switchValue="All" name="Logging Errors &amp; Warnings"> 
     <listeners> 
      <add name="Formatted EventLog TraceListener" /> 
     </listeners> 
     </errors> 
    </specialSources> 
    </loggingConfiguration> 
+0

Können Sie die relevanten Teile Ihrer Config? Werden die WebApp und die ConsoleApp auf demselben Computer ausgeführt? – RoelF

+0

Ja, WebApp und ConsolApp laufen auf demselben Computer – Costa

+0

"Ich habe alles mit Berechtigungen versucht" - Was haben Sie versucht? –

Antwort

4

Ich glaube, dass unter IIS7 (was ich Sie gehe davon sind Verwendung) der application pool will be running under NETWORK SERVICE.

Sie könnten NETWORK SERVICE Full Control für den Registrierungsschlüssel HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application eingeben.
(nicht empfohlen!)

Alternativ Sie die volle Kontrolle zu HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application JEDER gewähren könnte, eine Nachricht einzuloggen, dann diese Änderung zurück. Sobald der Schlüssel eingerichtet ist, benötigen Sie keine Berechtigungen mehr, um in die Registrierung zu schreiben.

Oder Sie könnten die Registrierungsschlüssel manuell konfigurieren, die Sie vorher benötigen die Erlaubnis Probleme zu vermeiden:

Windows Registry Editor Version 5.00 

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\Logger] 
"EventMessageFile"="c:\\WINNT\\Microsoft.NET\\Framework\\v2.0.50727\\EventLogMessages.dll" 


Nur ein Update auf diese Antwort, die nach MSDN: „eine erstellen Ereignisquelle in Windows Vista und höher oder Windows Server 2003 benötigen Sie Administratorrechte ".

+2

Ich denke, es ist eine schlechte Idee, Netzwerkdienst vollen Zugriff auf die Registrierung zu geben. – Costa

+0

Ja. Ich stimme dir zu - nicht zu empfehlen. –

+1

Sie können dem NETWORK SERVICE-Konto Schreibrechte nur für die von Ihnen benötigte Ereignisquelle erteilen.Tuzo erwähnt das meiste oben, aber hier ist ein Dokument, das helfen könnte: Ich weiß, dass dies jetzt eine ältere Frage ist, aber um das Ereignisprotokoll zu verwenden, muss die Ereignisquelle zuerst erstellt werden (von einem Benutzer mit Administratorrechten). Wenn Sie versuchen, dies auf einer Website zu verwenden, muss dem NETWORK SERVICE-Konto außerdem Zugriff zum Schreiben in das Ereignisprotokoll erteilt werden. Diese Seite wird helfen: http://msdn.microsoft.com/en-us/library/ms998320.aspx – Mark

4

ich ein Powershell-Skript verwenden Sie die entsprechende Quelle zu erstellen ...

$source = "FoToIaW" 
if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) 
{ 
    [System.Diagnostics.EventLog]::CreateEventSource($source, "Application") 
} 
1

oder diesen Code verwenden ....

public static void RunSnippet(string logName, string eventSource) 
{ 
    // this will throw an exception if you don't have admin rights 
    if (!EventLog.SourceExists(eventSource)) 
    { 
     System.Diagnostics.EventLog.CreateEventSource(eventSource, logName); 
     Console.WriteLine("Event Log and Source: {0},{1} were created successfully.",logName, eventSource); 
    } 
    else 
    { 
     Console.WriteLine("Event log/source: {0}/{1} already exists",logName, eventSource); 
    } 
    Console.WriteLine("Done"); 

} 
2

run Visual Studio als Administrator

  1. Klicken Sie mit der rechten Maustaste auf das Visual Studio-Symbol
  2. Klicken Sie auf "Als Administrator ausführen"