2010-06-03 9 views
12

J'ai passé une journée à essayer de faire en sorte que Ent Lib Logging fonctionne et enregistre quoi que ce soit dans la base de données ou le journal des événements. J'ai une application Web et une application console avec la même config. Ent Lib mais seule l'application console est capable de se connecter au journal des événements. J'ai tout essayé avec des permissions mais je ne sais pas exactement ce que je fais — quels services devraient avoir quoi. Ça ne marche pas! J'ai lu des articles comme http://imar.spaanjaars.com/275/logging-errors-to-the-event-log-in-aspnet-applications et je veux essayer de donner au compte ASPNET ces permissions. J'utilise Windows 7 et je ne trouve pas de compte d'utilisateur ASPNET. Alors où est-ce?Journalisation de la bibliothèque d'entreprise ne se connectant pas au journal des événements à partir d'ASP.NET

C'est le fichier de configuration qui est généré automatiquement à partir Ent Lib utilitaire et il ne fonctionne que sur App.config, et non sur 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

Pouvez-vous poster les parties pertinentes de votre config? L'application Web et l'application ConsoleApp s'exécutent-elles sur la même machine? – RoelF

+0

oui, WebApp et ConsolApp exécutés sur la même machine – Costa

+0

"J'ai tout essayé avec les permissions" - qu'avez-vous essayé? –

Répondre

4

Je crois que sous IIS7 (que je suppose que vous êtes en utilisant) application pool will be running under NETWORK SERVICE.

Vous pouvez essayer de donner le contrôle total du SERVICE NETWORK à la clé de registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application.
(non recommandé)

Sinon, vous pouvez accorder TOUT LE MONDE Contrôle total à HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application, connectez-vous un message, puis revenir à ce changement. Une fois la clé configurée, vous n'aurez plus besoin des autorisations pour écrire dans le registre.

Ou vous pouvez configurer manuellement les clés de Registre dont vous avez besoin au préalable pour éviter les problèmes d'autorisation:

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" 


Juste une mise à jour à cette réponse que, selon MSDN: « Pour créer un source d'événement dans Windows Vista et versions ultérieures ou Windows Server 2003, vous devez disposer des privilèges d'administrateur ".

+2

Je pense que c'est une mauvaise idée de donner au service réseau un accès complet au Registre. – Costa

+0

Oui. Je suis d'accord avec vous - pas recommandé. –

+1

Vous pouvez attribuer les privilèges d'écriture du compte NETWORK SERVICE à la source d'événements dont vous avez besoin.Tuzo en mentionne la plupart, mais voici un document qui pourrait aider: Je sais que c'est une question plus ancienne, mais pour utiliser le journal des événements, la source de l'événement doit être créée en premier (par un utilisateur ayant des privilèges administratifs). En outre, si vous essayez d'utiliser ceci dans un site Web, le compte SERVICE RÉSEAU doit avoir un accès pour écrire dans le journal des événements. Ce site vous aidera: http://msdn.microsoft.com/en-us/library/ms998320.aspx – Mark

4

J'utilise un script PowerShell pour créer la source appropriée ...

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

ou utilisez ce code ....

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 en tant qu'administrateur

  1. Cliquez avec le bouton droit sur l'icône Visual Studio
  2. Cliquez sur "Exécuter en tant qu'administrateur"