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?

IAdapter
źródło
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

Brandon
źródło
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.

empi
źródło
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.");

    }
}
šljaker
źródło
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");
miłość na żywo
źródło
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.

jonezy
źródło
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.

Bernoulli IT
źródło
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`);
MisdartedPenguin
źródło
7
Czy zdajesz sobie sprawę, że przegapisz pierwszy wpis, gdy plik jeszcze nie istnieje?
oɔɯǝɹ