Come si accede a C # senza utilizzare librerie di terze parti? [chiuso]


92

Vorrei implementare la registrazione nella mia applicazione, ma preferirei non utilizzare alcun framework esterno come log4net.

Quindi vorrei fare qualcosa come l' eco di DOS su un file. Qual è il modo più efficace per farlo?

Esiste un modo per registrare le eccezioni non gestite registrate senza utilizzare un framework esterno?


1
È possibile utilizzare System.Diagnostics.TraceSource integrato . <br> Di seguito è riportato un elenco dei listener di traccia incorporati + FileLogTraceListener . Ci sono molti manuali sul web come questo , [o questo di Jeff Atwood] ( codinghorror.com/blog/2005/03/logging-tracelistener
HuBeZa

2
Penso che la libreria aziendale sia un'opzione migliore di log4net.
hungryMind

Se stai solo cercando una semplice registrazione della console, System.Diagnostics.Tracing è probabilmente per te. Trace può essere utilizzato come Console (Trace.WriteLine).
Paul il

Risposte:


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

Per ulteriori informazioni MSDN


22
dovresti usare un usingfile on, anche se dal momento che è locale a un metodo verrà comunque immesso presto.
markmnl

19
Tieni inoltre presente che quando file.WriteLine(lines);genera un'eccezione, il codice non verrà mai visualizzato file.Close();. Fare uso di usingè un equivalente per try { // using block } finally { // Dispose }. Ciò significa che l'oggetto verrà eliminato anche se il codice all'interno del usingblocco genera un'eccezione,
Memet Olsen

6
Cosa succede se questo metodo viene chiamato di nuovo prima che la registrazione sia completa? Si solleverà un errore - Il processo non può accedere al file 'C: \ test.txt' perché è utilizzato da un altro processo. Qualcuno conosce questo problema?
Mike Sportsman,

23

Preferirei non utilizzare alcun framework esterno come log4j.net.

Perché? Log4net probabilmente risponderebbe alla maggior parte delle tue esigenze. Ad esempio, controlla questa classe: RollingFileAppender .

Log4net è ben documentato e ci sono migliaia di risorse e casi d'uso sul web.


3
il motivo è che non ho mai usato librerie esterne in .net, quindi devo prima imparare come farlo;)
IAdapter

4
Aggiungi semplicemente un riferimento al tuo progetto e inserisci una configurazione xml: è davvero facile. Tutorial di Google per log4net e scegli quello più adatto a te.
empi

23
Usa Nuget. Usare le biblioteche esterne diventerà un gioco da ragazzi
heneryville

36
Perché così tanti voti positivi? La domanda afferma due volte che OP non vuole utilizzare un framework esterno e menziona esplicitamente che non vuole Log4net. Sicuramente questo dovrebbe essere un commento, non una risposta?
RyanfaeScotland

9
@RyanfaeScotland Hai ragione, forse non è adatto a OP ma per favore non dimenticare che questo è un sito pubblico. Poiché il titolo della domanda indica solo "Come eseguire il login in c #", anche le persone come me che stanno bene con qualsiasi libreria atterreranno qui e troveranno utile questa risposta. In effetti, questo thread è stato il primo risultato quando ho cercato su Google "c # logging".
swenzel

18

È possibile scrivere direttamente in un registro eventi. Controlla i seguenti collegamenti:
http://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

Ed ecco l'esempio di 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
Qual è la migliore pratica per utilizzare lo stesso EventLog in classi diverse? Passarlo come parametro in Constructor? Accedervi staticamente da qualche classe singleton? O qualcosa di meglio?
dpelisek

15

Se stai cercando un modo davvero semplice per accedere, puoi usare questo liner. Se il file non esiste, viene creato.

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

Il problema con questa soluzione è che aggiunge operazioni di I / O. Pertanto non è consigliabile utilizzarlo per la registrazione di operazioni di algoritmo batch
Rami Yampolsky

@ RamiYampolsky, non capisco cosa intendi.
dan-gph

@ dan-gph Se si implementa del codice che sta eseguendo molte operazioni sulla CPU, in caso di logging durante questo codice, si "spreca" un po 'di tempo per il logging invece che per l'algoritmo effettivo che si tenta di implementare. Quindi preferisci "sprecare" il più breve tempo possibile. L'esecuzione di operazioni di I / O come nell'esempio sopra è davvero lunga, quindi se hai molti comandi di registrazione nel tuo codice, può rendere l'intera esecuzione circa 1000 volte più lenta!
Rami Yampolsky

@ RamiYampolsky, ho appena fatto quel ciclo di codice 100.000 volte e ci sono voluti 10 secondi. Quindi sono 10.000 voci di registro al secondo, ovvero 0,01 microsecondi per voce. Se registrassi 10 cose in 1 secondo, ci vorrebbero 0,1 microsecondi. Quindi no, non è affatto un sovraccarico.
dan-gph

@ dan-gph La mia risposta si riferiva a un caso d'uso diverso. Prova a fare un loop 100.000 volte che fa qualche calcolo per semplicità, fai semplicemente sum + = i e poi fai il log. Provalo con e senza il registro
Rami Yampolsky

7

Scrivevo la mia registrazione degli errori fino a quando non ho scoperto ELMAH . Non sono mai stato in grado di ottenere la parte di e-mail così perfettamente come fa ELMAH.


Lo guarderò, per il mio ragionamento controlla il mio commento di empi.
IAdapter

ELMAH è così semplice che non è nemmeno divertente, puoi letteralmente rilasciarlo e aggiungere alcune righe alla tua configurazione web e funziona.
jonezy

Anche in termini di esigenza di sapere quando la tua app sta per / sta iniziando a esplodere, trovo che elmah sia migliore della maggior parte degli altri grazie alla sua capacità di inviare e-mail, quindi finché il server è attivo riceverai email di errore da elmah.
jonezy

6

Se vuoi rimanere vicino a .NET, controlla Enterprise Library Logging Application Block . Guarda qui . O per un tutorial di avvio rapido, controlla questo . Ho usato l'applicazione Validation Block dalla Enterprise Library e si adatta davvero alle mie esigenze ed è molto facile da "ereditare" (installarlo e aggiornarlo!) Nel tuo progetto.


4

Se desideri un log degli errori personalizzato, puoi facilmente scrivere il tuo codice. Ti do uno snippet da uno dei miei progetti.

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

Quindi per scrivere effettivamente nel registro degli errori basta scrivere ( qessendo l'eccezione rilevata)

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

7
Sei consapevole che ti mancherà la prima voce quando il file non esiste ancora?
dal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.