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?

IAdapter
la source
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

Brandon
la source
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.

empi
la source
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.");

    }
}
šljaker
la source
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");
l'amour en direct
la source
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.

Jonezy
la source
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.

Bernoulli IT
la source
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`);
Manchot mal parti
la source
7
Vous savez que vous manquerez la première entrée lorsque le fichier n'existe pas encore?
oɔɯǝɹ