Comment puis-je me connecter en C # sans utiliser de bibliothèques tierces? [fermé]


92

Je voudrais implémenter la journalisation dans mon application, mais je préfère ne pas utiliser de frameworks extérieurs comme log4net.

Je voudrais donc faire quelque chose comme l' écho de DOS dans un fichier. Quelle est la manière la plus efficace de le faire?

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


1
Vous pouvez utiliser le System.Diagnostics.TraceSource intégré . <br> Voici une liste des écouteurs de trace intégrés + FileLogTraceListener . Il existe de nombreux manuels sur le Web comme celui-ci , [ou celui de Jeff Atwood] ( codinghorror.com/blog/2005/03/logging-tracelistener
HuBeZa

2
Je pense que la bibliothèque d'entreprise est meilleure option que log4net.
hungryMind le

Si vous recherchez uniquement une journalisation de console simple, System.Diagnostics.Tracing est probablement pour vous. Trace peut être utilisé comme Console (Trace.WriteLine).
Paul

Réponses:


66
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
vous devriez utiliser un usingfichier, cependant comme il est local à une méthode sera bientôt diposée de toute façon.
markmnl

19
Gardez également à l'esprit que lorsque vous file.WriteLine(lines);lancez une exception, le code ne frappera jamais file.Close();. Utiliser usingest un équivalent pour try { // using block } finally { // Dispose }. Cela signifie que l'objet sera supprimé même si le code à l'intérieur du usingbloc lève une exception,
Memet Olsen

6
Que faire si cette méthode est appelée à nouveau avant la fin de la journalisation? Vous allez générer une erreur - Le processus ne peut pas accéder au fichier «C: \ test.txt» car il est utilisé par un autre processus. Quelqu'un est-il au courant de ce problème?
Mike Sportsman

23

Je préférerais ne pas utiliser de frameworks extérieurs 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
la raison est que je n'ai jamais utilisé de bibliothèques extérieures dans .net, donc je dois d'abord apprendre à le faire;)
IAdapter

4
Ajoutez simplement une référence à votre projet et placez une configuration xml - c'est vraiment facile. Google pour le didacticiel log4net et choisissez celui qui vous convient le mieux.
empi

23
Utilisez Nuget. Utiliser des bibliothèques extérieures deviendra un jeu d'enfant
heneryville

36
Pourquoi tant de votes positifs? La question indique deux fois que OP ne veut pas utiliser un cadre externe et mentionne explicitement ne pas vouloir Log4net. Cela devrait sûrement être un commentaire, pas une réponse?
RyanfaeScotland

9
@RyanfaeScotland Vous avez raison, peut-être que cela ne conviendra pas à OP, mais n'oubliez pas que c'est un site public. Puisque le titre de la question indique seulement "Comment se connecter en c #", des gens comme moi qui sont d'accord avec n'importe quelle bibliothèque atterriront ici et trouveront cette réponse utile. En fait, ce fil était le premier résultat lorsque j'ai cherché sur Google "c # logging".
swenzel

18

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

Et voici l'exemple 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
Quelle est la meilleure pratique pour utiliser le même EventLog dans différentes classes? Passez-le en paramètre dans Constructor? Y accéder statiquement à partir d'une classe singleton? Ou quelque chose de mieux?
dpelisek

15

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

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

Le problème avec cette solution est qu'elle ajoute une opération d'E / S. Donc, son utilisation n'est pas recommandée pour la journalisation des opérations d'algorithme par lots
Rami Yampolsky

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

@ dan-gph Si vous implémentez du code qui fait 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 «gaspiller» le moins de temps possible. Faire des opérations d'E / S comme dans l'exemple ci-dessus est vraiment long, donc si vous avez beaucoup de commandes de journalisation dans votre code, cela peut rendre toute votre exécution environ 1000 fois plus lente!
Rami Yampolsky

@RamiYampolsky, je viens de faire cette boucle de code 100 000 fois, et cela a pris 10 secondes. Cela représente donc 10 000 entrées de journal par seconde, soit 0,01 microseconde par entrée. Si vous avez enregistré 10 choses en 1 seconde, cela prendrait 0,1 microseconde. Donc non, ce n'est pas du tout beaucoup de frais généraux.
dan-gph

@ dan-gph Ma réponse concernait différents cas d'utilisation. Essayez de faire une boucle 100 000 fois, ce qui fait un calcul pour plus de simplicité, faites simplement sum + = i puis faites le journal. Essayez-le avec et sans le journal
Rami Yampolsky

7

J'écrivais mon propre journal des erreurs jusqu'à ce que je découvre ELMAH . Je n'ai jamais pu obtenir la partie emailing aussi parfaitement qu'ELMAH.


Je vais l'examiner, pour mon raisonnement, veuillez consulter le commentaire de mon empi.
IAdapter

ELMAH est tellement simple que ce n'est même pas drôle, vous pouvez littéralement le déposer et ajouter quelques lignes à votre configuration Web et cela fonctionne.
jonezy

Également en ce qui concerne votre exigence de savoir quand votre application est sur le point / commence à exploser, je trouve qu'elmah est meilleur que la plupart des autres en raison de sa capacité à envoyer des e-mails, donc tant que le serveur est actif, vous recevrez des e-mails d'erreur de elmah.
jonezy

6

Si vous souhaitez rester proche de .NET, consultez Bloc d'application de journalisation de la bibliothèque d'entreprise . Regardez ici . Ou pour un tutoriel de démarrage rapide, vérifiez ceci . J'ai utilisé le bloc d'application Validation de la bibliothèque d'entreprise et il répond vraiment à mes besoins et est très facile à «hériter» (l'installer et le référencer!) Dans votre projet.


4

Si vous voulez votre propre enregistrement d'erreurs personnalisé, vous pouvez facilement écrire votre propre code. Je vais vous donner un extrait de l'un de mes projets.

public void SaveLogFile(object method, Exception exception)
{
    string location = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\FolderName\";
    try
    {
        //Opens a new file stream which allows asynchronous reading and writing
        using (StreamWriter sw = new StreamWriter(new FileStream(location + @"log.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite)))
        {
            //Writes the method name with the exception and writes the exception underneath
            sw.WriteLine(String.Format("{0} ({1}) - Method: {2}", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), method.ToString()));
            sw.WriteLine(exception.ToString()); sw.WriteLine("");
        }
    }
    catch (IOException)
    {
        if (!File.Exists(location + @"log.txt"))
        {
            File.Create(location + @"log.txt");
        }
    }
}

Ensuite, pour réellement écrire dans le journal des erreurs, écrivez simplement ( qétant l'exception interceptée)

SaveLogFile(MethodBase.GetCurrentMethod(), `q`);

7
Vous savez que vous manquerez la première entrée lorsque le fichier n'existe pas encore?
oɔɯǝɹ
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.