[c#] Ecriture d'exceptions dans le fichier journal Windows


Answers

Vous pouvez également envisager d'utiliser la bibliothèque d'entreprise . Cela a l'air compliqué au début mais une heure ou deux de jeu sera payante. Config est stocké dans app.config afin que vous puissiez le modifier sans recompiler - cela peut être très utile lorsque vous avez le même code assis sur des serveurs test et live avec une configuration différente. Vous pouvez faire beaucoup de choses sans beaucoup de code.

Une bonne chose est que vous pouvez définir des politiques d'exception afin que les exceptions soient automatiquement consignées. Voici un code que vous pourriez utiliser (j'utilise 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 renverra l'exception SI l'ExPol1 la définit. Si ExPol1 est configuré pour être renvoyé, ExceptionPolicy.HandleException retournera true. Sinon, il renvoie false.

Vous définissez le reste dans la configuration. Le XML semble assez horrible (n'est-ce pas toujours le cas) mais vous le créez à l'aide de l'éditeur de configuration de la bibliothèque d'entreprise. Je fournis juste pour l'exhaustivité.

Dans la section loggingConfiguration, ce fichier définit

  • le journal: un fichier journal de texte roulant (vous pouvez utiliser les journaux d'événements Windows intégrés, les tables sql, le courrier électronique, 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 configure cela pour tout écrire sur une ligne, d'autres fois répartis sur plusieurs lignes),
  • une seule catégorie "Général"
  • une source spéciale qui piège toutes les erreurs dans la config / entlib et les signale également. Je vous conseille fortement de le faire.

Dans la section exceptionHandling, il définit

  • une politique unique: "ExPo1", qui gère le type ArgumentNullExceptions et spécifie l'action postHandlingAction de None (c'est-à-dire ne pas rethrow).
  • un gestionnaire qui se connecte à la catégorie Général (défini ci-dessus)

Je ne le fais pas dans cet exemple, mais vous pouvez également remplacer une exception par un type différent en utilisant 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>
Question

J'aimerais attraper mes exceptions et les enregistrer dans le fichier journal Windows. Comment puis-je ouvrir et écrire dans le journal Windows?







Related