Jak mogę zalogować się w języku C # bez korzystania z bibliotek innych firm? [Zamknięte]


92

Chciałbym zaimplementować logowanie w mojej aplikacji, ale wolałbym nie używać żadnych zewnętrznych frameworków, takich jak log4net.

Więc chciałbym zrobić coś takiego jak echo DOS- a do pliku. Jaki jest najskuteczniejszy sposób, aby to zrobić?

Czy istnieje sposób rejestrowania nieobsłużonych wyjątków zarejestrowanych bez korzystania z zewnętrznej struktury?


1
Możesz użyć wbudowanego System.Diagnostics.TraceSource . <br> Oto lista wbudowanych detektorów śledzenia + FileLogTraceListener . W sieci jest wiele podręczników, takich jak ten [lub ten autorstwa Jeffa Atwooda] ( codinghorror.com/blog/2005/03/logging-tracelistener
HuBeZa

2
Uważam, że biblioteka korporacyjna jest lepszą opcją niż log4net.
hungryMind

Jeśli szukasz tylko prostego rejestrowania konsoli, System.Diagnostics.Tracing jest prawdopodobnie dla Ciebie. Trace może być używane jak Console (Trace.WriteLine).
Paul

Odpowiedzi:


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

Aby uzyskać więcej informacji, MSDN


22
powinieneś użyć usingpliku on file, chociaż ponieważ jest on lokalny dla metody, i tak zostanie wkrótce usunięty.
markmnl

19
Pamiętaj również, że gdy file.WriteLine(lines);zgłasza wyjątek, kod nigdy nie trafi file.Close();. Korzystanie z usingjest odpowiednikiem try { // using block } finally { // Dispose }. Oznacza to, że obiekt zostanie usunięty, nawet jeśli kod wewnątrz usingbloku zgłosi wyjątek,
Memet Olsen

6
Co się stanie, jeśli ta metoda zostanie ponownie wywołana przed zakończeniem rejestrowania? Pojawi się błąd - proces nie może uzyskać dostępu do pliku „C: \ test.txt”, ponieważ jest używany przez inny proces. Czy ktoś wie o tym problemie?
Mike Sportsman

23

Wolałbym nie używać żadnych zewnętrznych frameworków, takich jak log4j.net.

Czemu? Log4net prawdopodobnie spełniłby większość Twoich wymagań. Na przykład sprawdź tę klasę: RollingFileAppender .

Log4net jest dobrze udokumentowany, aw sieci można znaleźć tysiące zasobów i przypadków użycia.


3
powodem jest to, że nigdy nie korzystałem z żadnych zewnętrznych bibliotek w .net, więc najpierw muszę się nauczyć, jak to zrobić;)
IAdapter

4
Po prostu dodaj odniesienie do swojego projektu i umieść konfigurację xml - to naprawdę proste. Samouczek Google for log4net i wybierz ten, który jest dla Ciebie najlepszy.
empi

23
Użyj Nuget. Korzystanie z zewnętrznych bibliotek stanie się
dziecinnie

37
Skąd tyle głosów za? Pytanie dwukrotnie stwierdza, że ​​OP nie chce używać zewnętrznej struktury i wyraźnie wspomina, że ​​nie chce Log4net. Z pewnością powinien to być komentarz, a nie odpowiedź?
RyanfaeScotland

9
@RyanfaeScotland Masz rację, może to nie będzie pasować do OP, ale nie zapominaj, że to jest strona publiczna. Ponieważ tytuł pytania zawiera tylko „Jak zalogować się w języku c #”, również osoby takie jak ja, którym nie przeszkadza korzystanie z dowolnej biblioteki, wylądują tutaj i uznają tę odpowiedź za przydatną. W rzeczywistości ten wątek był pierwszym wynikiem, gdy wyszukałem w Google „rejestrowanie C #”.
swenzel

18

Możesz pisać bezpośrednio do dziennika zdarzeń. Sprawdź następujące łącza:
http://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

A oto przykład z 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
Jaka jest najlepsza praktyka używania tego samego EventLog w różnych klasach? Przekazać go jako parametr w konstruktorze? Masz do niego dostęp statycznie z jakiejś pojedynczej klasy? Albo coś lepszego?
dpelisek

15

Jeśli szukasz naprawdę prostego sposobu logowania, możesz użyć tej jednej wkładki. Jeśli plik nie istnieje, zostanie utworzony.

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

Problem z tym rozwiązaniem polega na tym, że dodaje ono operację IO. Dlatego używanie go nie jest zalecane do rejestrowania operacji algorytmów wsadowych
Rami Yampolsky

@RamiYampolsky, nie rozumiem, co masz na myśli.
dan-gph

@ dan-gph Jeśli zaimplementujesz jakiś kod, który wykonuje wiele operacji procesora, w przypadku logowania podczas tego kodu, „marnujesz” trochę czasu, który jest przeznaczony na logowanie zamiast na rzeczywisty algorytm, który próbujesz zaimplementować. Dlatego wolisz „marnować” jak najkrótszy czas. Wykonywanie operacji we / wy, jak w powyższym przykładzie, jest naprawdę długie, więc jeśli masz dużo poleceń logowania w swoim kodzie, może to spowodować, że całe wykonanie będzie około 1000 razy wolniejsze!
Rami Yampolsky,

@RamiYampolsky, właśnie wykonałem pętlę kodu 100 000 razy i zajęło to 10 sekund. Czyli to 10 000 wpisów dziennika na sekundę, czyli 0,01 mikrosekundy na wpis. Jeśli zarejestrowałeś 10 rzeczy w 1 sekundę, zajęłoby to 0,1 mikrosekundy. Więc nie, to wcale nie jest zbyt duże obciążenie.
dan-gph

@ dan-gph Moja odpowiedź dotyczyła innego przypadku użycia. Spróbuj wykonać pętlę 100 000 razy, co da pewne obliczenia dla uproszczenia, po prostu wykonaj sumę + = i, a następnie wykonaj dziennik. Wypróbuj z logiem i bez
Rami Yampolsky

7

Pisałem własne rejestrowanie błędów, dopóki nie odkryłem ELMAH . Nigdy nie udało mi się tak perfekcyjnie wykonać części dotyczącej wysyłania e-maili, jak robi to ELMAH.


Przyjrzę się temu, dla mojego rozumowania proszę sprawdzić komentarz mojego empi.
IAdapter,

ELMAH jest tak prosty, że nawet nie jest zabawny, dosłownie możesz go wrzucić i dodać kilka wierszy do konfiguracji internetowej i działa.
jonezy

Również jeśli chodzi o wymagania dotyczące wiedzy, kiedy Twoja aplikacja ma zamiar wybuchnąć / zaczyna wybuchać, uważam, że elmah jest lepszy niż większość innych ze względu na możliwość wysyłania e-maili, więc tak długo, jak serwer będzie działał, otrzymasz e-maile z błędami elmah.
jonezy

6

Jeśli chcesz pozostać blisko .NET, sprawdź Enterprise Library Logging Application Block . Spójrz tutaj . Lub, aby zapoznać się z samouczkiem szybkiego startu, sprawdź to . Użyłem bloku aplikacji walidacyjnej z biblioteki korporacyjnej i naprawdę odpowiada on moim potrzebom i jest bardzo łatwy do „odziedziczenia” (zainstalowania i odnowienia!) W Twoim projekcie.


4

Jeśli chcesz mieć własne, niestandardowe rejestrowanie błędów, możesz łatwo napisać własny kod. Dam ci fragment jednego z moich projektów.

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

Następnie, aby faktycznie zapisać w dzienniku błędów, po prostu napisz ( qbędąc złapanym wyjątkiem)

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

7
Czy zdajesz sobie sprawę, że przegapisz pierwszy wpis, gdy plik jeszcze nie istnieje?
oɔɯǝɹ
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.