Wie melde ich mich in C # an, ohne Bibliotheken von Drittanbietern zu verwenden? [geschlossen]

92

Ich möchte die Protokollierung in meiner Anwendung implementieren, möchte jedoch keine externen Frameworks wie log4net verwenden.

Also möchte ich so etwas wie das Echo von DOS mit einer Datei machen. Was ist der effektivste Weg, dies zu tun?

Gibt es eine Möglichkeit, nicht behandelte Ausnahmen zu protokollieren, die ohne Verwendung eines externen Frameworks protokolliert wurden?

IAdapter
quelle
1
Sie können die integrierte System.Diagnostics.TraceSource verwenden . <br> Hier ist eine Liste der integrierten Trace-Listener + FileLogTraceListener . Es gibt viele Handbücher über das Web wie dieses [oder dieses von Jeff Atwood] ( codinghorror.com/blog/2005/03/logging-tracelistener
HuBeZa
2
Ich denke, Unternehmensbibliothek bessere Option als log4net.
hungrigMind
Wenn Sie nur nach einer einfachen Konsolenprotokollierung suchen, ist System.Diagnostics.Tracing wahrscheinlich das Richtige für Sie. Trace kann wie Console (Trace.WriteLine) verwendet werden.
Paul

Antworten:

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);
  }
}

Weitere Informationen MSDN

Brandon
quelle
22
Sie sollten eine usingOn-Datei verwenden, da diese lokal ist, wird sie ohnehin bald gelöscht.
Markmnl
19
Denken Sie auch daran, dass file.WriteLine(lines);der Code beim Auslösen einer Ausnahme niemals getroffen wird file.Close();. Nutzen usingist ein Äquivalent für try { // using block } finally { // Dispose }. Dies bedeutet, dass das Objekt auch dann entsorgt wird, wenn der Code innerhalb des usingBlocks eine Ausnahme
auslöst.
6
Was ist, wenn diese Methode erneut aufgerufen wird, bevor die Protokollierung abgeschlossen ist? Sie werden einen Fehler auslösen - Der Prozess kann nicht auf die Datei 'C: \ test.txt' zugreifen, da sie von einem anderen Prozess verwendet wird. Kennt jemand dieses Problem?
Mike Sportsman
23

Ich würde lieber keine externen Frameworks wie log4j.net verwenden.

Warum? Log4net würde wahrscheinlich die meisten Ihrer Anforderungen erfüllen. Überprüfen Sie zum Beispiel diese Klasse: RollingFileAppender .

Log4net ist gut dokumentiert und es gibt Tausende von Ressourcen und Anwendungsfällen im Web.

empi
quelle
3
Der Grund ist, dass ich in .net noch nie externe Bibliotheken verwendet habe, daher muss ich erst lernen, wie es geht;)
IAdapter
4
Fügen Sie einfach einen Verweis auf Ihr Projekt hinzu und platzieren Sie eine XML-Konfiguration - es ist wirklich einfach. Google für log4net Tutorial und wählen Sie das für Sie am besten geeignete.
Empi
23
Benutze Nuget. Die Nutzung
externer
36
Warum so viele positive Stimmen? Die Frage besagt zweimal, dass OP kein externes Framework verwenden möchte, und erwähnt ausdrücklich, dass Log4net nicht benötigt wird. Sicherlich sollte dies ein Kommentar sein, keine Antwort?
RyanfaeScotland
9
@RyanfaeScotland Du hast Recht, vielleicht passt es nicht zu OP, aber bitte vergiss nicht, dass dies eine öffentliche Seite ist. Da der Titel der Frage nur "So melden Sie sich in c # an" lautet, landen auch Leute wie ich, die mit der Verwendung einer Bibliothek einverstanden sind, hier und finden diese Antwort hilfreich. Tatsächlich war dieser Thread das erste Ergebnis, als ich nach "c # logging" googelte.
Swenzel
18

Sie können direkt in ein Ereignisprotokoll schreiben. Überprüfen Sie die folgenden Links:
http://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

Und hier ist das Beispiel von 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
quelle
1
Was ist die beste Vorgehensweise, um dasselbe EventLog in verschiedenen Klassen zu verwenden? Als Parameter im Konstruktor übergeben? Statisch von einer Singleton-Klasse darauf zugreifen? Oder etwas besseres?
dpelisek
15

Wenn Sie nach einer wirklich einfachen Methode zum Protokollieren suchen, können Sie diesen einen Liner verwenden. Wenn die Datei nicht vorhanden ist, wird sie erstellt.

System.IO.File.AppendAllText(@"c:\log.txt", "mymsg\n");
Live-Liebe
quelle
Das Problem bei dieser Lösung besteht darin, dass die E / A-Operation hinzugefügt wird. Daher wird die Verwendung für die Protokollierung von Batch-Algorithmus-Operationen nicht empfohlen
Rami Yampolsky,
@ RamiYampolsky, ich verstehe nicht was du meinst.
Dan-Gph
@ dan-gph Wenn Sie Code implementieren, der viele CPU-Operationen ausführt, "verschwenden" Sie im Falle der Protokollierung während dieses Codes etwas Zeit für die Protokollierung anstelle des eigentlichen Algorithmus, den Sie implementieren möchten. Sie "verschwenden" also lieber so kurz wie möglich. Das Ausführen von E / A-Vorgängen wie im obigen Beispiel ist sehr lang. Wenn Sie also viele Protokollierungsbefehle in Ihrem Code haben, kann dies Ihre gesamte Ausführung etwa 1000-mal langsamer machen!
Rami Yampolsky
@RamiYampolsky, ich habe diese Codeschleife gerade 100.000 Mal erstellt und es hat 10 Sekunden gedauert. Das sind also 10.000 Protokolleinträge pro Sekunde, was 0,01 Mikrosekunden pro Eintrag entspricht. Wenn Sie 10 Dinge in 1 Sekunde protokollieren würden, würde dies 0,1 Mikrosekunden dauern. Also nein, das ist überhaupt nicht viel Aufwand.
Dan-Gph
@ dan-gph Meine Antwort bezog sich auf verschiedene Anwendungsfälle. Versuchen Sie, 100.000 Mal eine Schleife auszuführen, um der Einfachheit halber einige Berechnungen durchzuführen. Führen Sie einfach sum + = i aus und führen Sie dann das Protokoll aus. Probieren Sie es mit und ohne Protokoll
Rami Yampolsky
7

Ich habe meine eigene Fehlerprotokollierung geschrieben, bis ich ELMAH entdeckte . Ich habe es nie geschafft, den E-Mail-Teil so perfekt zu machen wie ELMAH.

jonezy
quelle
Ich werde es mir ansehen, für meine Argumentation lesen Sie bitte den Kommentar meines Empis.
IAdapter
ELMAH ist so einfach, dass es nicht einmal lustig ist. Sie können es buchstäblich in ein paar Zeilen zu Ihrer Webkonfiguration hinzufügen und es funktioniert.
jonezy
Auch in Bezug auf Ihre Anforderung, zu wissen, wann Ihre App in die Luft geht / zu explodieren beginnt, finde ich, dass elmah besser ist als die meisten anderen, da es E-Mails senden kann. Solange der Server aktiv ist, erhalten Sie Fehler-E-Mails von Elma.
jonezy
6

Wenn Sie in der Nähe von .NET bleiben möchten, lesen Sie Enterprise Application Logging Application Block . Schau hier . Oder überprüfen Sie dies für ein Schnellstart-Tutorial . Ich habe den Validierungsanwendungsblock aus der Unternehmensbibliothek verwendet und er entspricht wirklich meinen Anforderungen und ist sehr einfach in Ihrem Projekt zu "erben" (installieren und aktualisieren!).

Bernoulli IT
quelle
4

Wenn Sie eine eigene Fehlerprotokollierung wünschen, können Sie ganz einfach Ihren eigenen Code schreiben. Ich gebe Ihnen einen Ausschnitt aus einem meiner Projekte.

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");
        }
    }
}

Um dann tatsächlich in das Fehlerprotokoll zu schreiben, schreiben Sie einfach ( qals gefangene Ausnahme)

SaveLogFile(MethodBase.GetCurrentMethod(), `q`);
MisdartedPenguin
quelle
7
Sie wissen, dass Sie den ersten Eintrag verpassen werden, wenn die Datei noch nicht vorhanden ist?
o