36 votes

L'écriture des Exceptions à la Windows Fichier Journal

J'aimerais reprendre mon exceptions et les enregistre dans le fichier journal Windows. Comment puis-je aller sur l'ouverture et l'écriture de l'ouverture de session Windows?

36voto

Doctor Jones Points 11502

Vous pouvez utiliser le Système.Diagnostics.Le journal des événements.WriteEntry fonction pour écrire des entrées dans le journal des événements.

System.Diagnostics.EventLog.WriteEntry("MyEventSource", exception.StackTrace,                  
                                       System.Diagnostics.EventLogEntryType.Warning);

À lire les journaux d'événements, vous pouvez utiliser le Système.Diagnostics.Le journal des événements.GetEventLogs fonction.

//here's how you get the event logs
var eventLogs = System.Diagnostics.EventLog.GetEventLogs();

foreach(var eventLog in eventLogs)
{    
    //here's how you get the event log entries
    foreach(var logEntry in eventLog.Entries)
    {
        //do something with the entry
    }    
}

10voto

serialhobbyist Points 2554

Vous pouvez également envisager l'utilisation de la Bibliothèque d'Entreprise. Il semble compliqué pour commencer mais une heure ou deux de jeu sera payante. La Config est stocké dans l'app.config de sorte que vous pouvez le modifier sans avoir à recompiler, ce qui peut être vraiment pratique quand vous avez le même code assis sur le test et les serveurs en direct avec différentes config. Vous pouvez faire beaucoup de chose sans charges de code.

Une bonne chose est que vous pouvez définir des stratégies d'Exception, de sorte que les exceptions sont automatiquement enregistrées. Voici un code que vous pourriez utiliser (je suis en utilisant EntLib 4.1):

    try
    {
        //This would be where your exception might be thrown.  I'm doing it on
        //purpose so you can see it work
        throw new ArgumentNullException("param1");
    }
    catch (Exception ex)
    {
        if (ExceptionPolicy.HandleException(ex, "ExPol1")) throw;
    }

La ligne dans le bloc catch va renvoyer l'exception SI la ExPol1 la définit. Si ExPol1 est configuré pour renvoyer, puis ExceptionPolicy.HandleException retournera true. Sinon, elle retourne false.

Vous définissez le reste de la config. Le XML a l'air assez horrible (n'est-ce pas toujours), mais vous créez cette aide de l'Entreprise de Configuration de la Bibliothèque de l'éditeur. Je suis juste de les fournir à des fins d'exhaustivité.

Dans le loggingConfiguration section, ce fichier définit

  • le journal: un roulement de texte fichier journal (vous pouvez utiliser le construit dans les journaux d'événements windows, les tables sql, e-mail, msmq et autres), avec
  • un formateur de texte qui régit la façon dont les paramètres sont écrits dans le journal (parfois je configurer ce tout écrire sur une même ligne, d'autres fois, réparties dans de nombreux),
  • une seule catégorie "Général"
  • une Source Particulière qui intercepte les erreurs dans le fichier config/entlib et les rapports entre eux ainsi. Je vous conseille fortement de le faire.

Dans le exceptionHandling section, il définit

  • une seule politique: "ExPo1", qui gère type ArgumentNullExceptions et spécifie la postHandlingAction de Rien (c'est à dire ne pas renvoyer).
  • un gestionnaire qui ouvre à la catégorie Générale (défini ci-dessus)

Je ne le fais pas dans cet exemple, mais vous pouvez également remplacer une exception avec un autre type à l'aide d'une politique.

   <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </configSections>
      <loggingConfiguration name="Logging Application Block" tracingEnabled="true"
        defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
        <listeners>
          <add fileName="rolling.log" footer="" formatter="Text Formatter"
            header="" rollFileExistsBehavior="Overwrite" rollInterval="None"
            rollSizeKB="500" timeStampPattern="yyyy-MM-dd" listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            traceOutputOptions="None" filter="All" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            name="Rolling Flat File Trace Listener" />
        </listeners>
        <formatters>
          <add template="Timestamp: {timestamp}; Message: {message}; Category: {category}; Priority: {priority}; EventId: {eventid}; Severity: {severity}; Title:{title}; Machine: {machine}; Application Domain: {appDomain}; Process Id: {processId}; Process Name: {processName}; Win32 Thread Id: {win32ThreadId}; Thread Name: {threadName}; &#xD;&#xA;     Extended Properties: {dictionary({key} - {value})}"
            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="Rolling Flat File Trace Listener" />
            </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="Rolling Flat File Trace Listener" />
            </listeners>
          </errors>
        </specialSources>
      </loggingConfiguration>
      <exceptionHandling>
        <exceptionPolicies>
          <add name="ExPol1">
            <exceptionTypes>
              <add type="System.ArgumentNullException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                postHandlingAction="None" name="ArgumentNullException">
                <exceptionHandlers>
                  <add logCategory="General" eventId="100" severity="Error" title="Enterprise Library Exception Handling"
                    formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                    priority="0" useDefaultLogger="false" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                    name="Logging Handler" />
                </exceptionHandlers>
              </add>
            </exceptionTypes>
          </add>
        </exceptionPolicies>
      </exceptionHandling>
    </configuration>

6voto

Darin Dimitrov Points 528142

Windows utilise le journal des Événements de trace de l'activité. Vous pouvez utiliser l' System.Diagnostics.Trace classe:

var traceSwitch = new TraceSwitch("MySwitch", "");
var exception = new Exception("Exception message");

if (traceSwitch.TraceError)
{
    Trace.TraceError(exception);
}

Et vous pouvez utiliser l'app.config pour instruire l'enregistreur de données où écrire:

<system.diagnostics>
    <switches>
        <add name="MySwitch" value="Verbose" />
    </switches>
    <trace autoflush="true">
        <listeners>
            <add name="EventLogger"
                 type="System.Diagnostics.EventLogTraceListener"
                 initializeData="NameOfYourApplication" />
        </listeners>
    </trace>
 </system.diagnostics>

6voto

Jon Galloway Points 28243

Voici la réponse la plus simple à écrire dans le journal des événements: http://support.microsoft.com/kb/307024

Une meilleure solution est d'utiliser quelque chose comme log4net, qui se chargera de cela pour vous.

0voto

CrazyTim Points 503

Ces articles expliquent comment connecter automatiquement unhanded exceptions qui peuvent se produire:

VB.NET: http://visualbasic.about.com/od/usingvbnet/a/logging.htm

C#: Où écrire les fonctions de ApplicationEvents.vb lors de la conversion de projet C#

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X