92 votes

Comment faire de la journalisation en C# sans utiliser de bibliothèques tierces ?

J'aimerais mettre en œuvre la journalisation dans mon application, mais je préférerais ne pas utiliser de frameworks externes comme log4net.

J'aimerais donc faire quelque chose comme le DOS. echo dans un fichier. Quel est le moyen le plus efficace de le faire ?

Existe-t-il un moyen de consigner les exceptions non gérées sans utiliser un cadre externe ?

1 votes

Vous pouvez utiliser la fonction intégrée System.Diagnostics.TraceSource .<br>Voici une liste de les écouteurs de traces intégrés + FileLogTraceListener . Il existe de nombreux manuels sur le web comme ceci ou celui de Jeff Atwood]( codinghorror.com/blog/2005/03/logging-tracelistener

2 votes

Je pense que la bibliothèque d'entreprise est une meilleure option que log4net.

0 votes

Si vous ne recherchez qu'une simple journalisation de la console, System.Diagnostics.Tracing est probablement fait pour vous. Trace peut être utilisé comme Console (Trace.WriteLine).

66voto

Brandon Points 731
public void Logger(string lines)
{
  //Write the string to a file.append mode is enabled so that the log
  //lines get appended to  test.txt than wiping content and writing the log

  using(System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\test.txt", true))
  {
    file.WriteLine(lines);
  }
}

Pour plus d'informations MSDN

22 votes

Vous devez utiliser un using dans le dossier, mais comme elle est locale à une méthode, elle sera bientôt supprimée de toute façon.

19 votes

Gardez également à l'esprit que lorsque file.WriteLine(lines); lève une exception, le code n'atteindra jamais l'option file.Close(); . L'utilisation de using est un équivalent pour try { // using block } finally { // Dispose } . Cela signifie que l'objet sera éliminé même si le code à l'intérieur de la balise using lance une exception,

7 votes

Que se passe-t-il si cette méthode est appelée à nouveau avant la fin de la journalisation ? Vous obtiendrez une erreur - Le processus ne peut pas accéder au fichier ' C:\test.txt car il est utilisé par un autre processus. Quelqu'un connaît-il un moyen de contourner ce problème ?

27voto

HuBeZa Points 2184

Vous pouvez utiliser la fonction intégrée System.Diagnostics.TraceSource .
Voici une liste de les écouteurs de traces intégrés + FileLogTraceListener .

Il existe de nombreux manuels sur le web comme ceci , ou celui de Jeff Atwood + améliorations .

23voto

empi Points 8609

Je préférerais ne pas utiliser de frameworks comme log4j.net.

Pourquoi ? Log4net répondrait probablement à la plupart de vos besoins. Par exemple, vérifiez cette classe : RollingFileAppender .

Log4net est bien documenté et il existe des milliers de ressources et de cas d'utilisation sur le web.

3 votes

La raison est que je n'ai jamais utilisé de librairies externes dans .net, donc je dois d'abord apprendre à le faire ;)

4 votes

Il suffit d'ajouter une référence à votre projet et de placer une configuration xml - c'est très simple. Recherchez le tutoriel log4net sur Google et choisissez celui qui vous convient le mieux.

23 votes

Utilisez Nuget. L'utilisation de bibliothèques externes deviendra un jeu d'enfant

18voto

šljaker Points 3055

Vous pouvez écrire directement dans un journal d'événements. Consultez les liens suivants :
http://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

Et voici l'échantillon de MSDN :

using System;
using System.Diagnostics;
using System.Threading;

class MySample{

    public static void Main(){

        // Create the source, if it does not already exist.
        if(!EventLog.SourceExists("MySource"))
        {
             //An event log source should not be created and immediately used.
             //There is a latency time to enable the source, it should be created
             //prior to executing the application that uses the source.
             //Execute this sample a second time to use the new source.
            EventLog.CreateEventSource("MySource", "MyNewLog");
            Console.WriteLine("CreatedEventSource");
            Console.WriteLine("Exiting, execute the application a second time to use the source.");
            // The source is created.  Exit the application to allow it to be registered.
            return;
        }

        // Create an EventLog instance and assign its source.
        EventLog myLog = new EventLog();
        myLog.Source = "MySource";

        // Write an informational entry to the event log.    
        myLog.WriteEntry("Writing to event log.");

    }
}

1 votes

Quelle est la meilleure pratique pour utiliser le même EventLog dans différentes classes ? Le passer en paramètre dans le constructeur ? Y accéder statiquement à partir d'une classe singleton ? Ou quelque chose de mieux ?

15voto

40-Love Points 1333

Si vous cherchez un moyen vraiment simple de vous connecter, vous pouvez utiliser cette doublure. Si le fichier n'existe pas, il est créé.

System.IO.File.AppendAllText(@"c:\log.txt", "mymsg\n");

0 votes

Le problème de cette solution est qu'elle ajoute une opération IO. Son utilisation n'est donc pas recommandée pour l'enregistrement des opérations algorithmiques par lots.

0 votes

@RamiYampolsky, je ne comprends pas ce que vous voulez dire.

0 votes

Si vous implémentez un code qui effectue beaucoup d'opérations CPU, en cas de journalisation pendant ce code, vous "perdez" du temps pour la journalisation au lieu de l'algorithme réel que vous essayez d'implémenter. Vous préférez donc "perdre" le moins de temps possible. Faire une opération IO comme dans l'exemple ci-dessus est vraiment long, donc si vous avez beaucoup de commandes de journalisation dans votre code, cela peut rendre votre exécution entière environ 1000 fois plus lente !

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