¿Cómo puedo iniciar sesión en C # sin usar bibliotecas de terceros? [cerrado]

92

Me gustaría implementar el registro en mi aplicación, pero prefiero no usar marcos externos como log4net.

Entonces, me gustaría hacer algo como el eco de DOS en un archivo. ¿Cuál es la forma más eficaz de hacerlo?

¿Hay alguna forma de registrar las excepciones no controladas registradas sin utilizar un marco externo?

IAdapter
fuente
1
Puede utilizar System.Diagnostics.TraceSource integrado . <br> Aquí hay una lista de los escuchas de seguimiento integrados + FileLogTraceListener . Hay muchos manuales en la web como este , [o este de Jeff Atwood] ( codinghorror.com/blog/2005/03/logging-tracelistener
HuBeZa
2
Siento que la biblioteca empresarial es una mejor opción que log4net.
hungryMind
Si solo está buscando un registro de consola simple, System.Diagnostics.Tracing probablemente sea para usted. Trace se puede utilizar como Console (Trace.WriteLine).
Paul

Respuestas:

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

Para más información MSDN

Brandon
fuente
22
debe usar un usingarchivo, aunque dado que es local para un método, se eliminará pronto de todos modos.
markmnl
19
También tenga en cuenta que cuando se file.WriteLine(lines);lanza una excepción, el código nunca llegará file.Close();. Hacer uso de usinges un equivalente de try { // using block } finally { // Dispose }. Esto significa que el objeto se eliminará incluso si el código dentro del usingbloque arroja una excepción,
Memet Olsen
6
¿Qué sucede si se vuelve a llamar a este método antes de que se complete el registro? Aparecerá un error: el proceso no puede acceder al archivo 'C: \ test.txt' porque está siendo utilizado por otro proceso. ¿Alguien conoce este problema?
Mike Sportsman
23

Preferiría no usar marcos externos como log4j.net.

¿Por qué? Log4net probablemente abordaría la mayoría de sus requisitos. Por ejemplo, consulte esta clase: RollingFileAppender .

Log4net está bien documentado y hay miles de recursos y casos de uso en la web.

empi
fuente
3
la razón es que nunca he usado bibliotecas externas en .net, así que primero necesito aprender a hacerlo;)
IAdapter
4
Simplemente agregue una referencia a su proyecto y coloque alguna configuración xml; es realmente fácil. Google para el tutorial de log4net y elija el que sea mejor para usted.
empi
23
Utilice Nuget. Usar bibliotecas externas será muy fácil
heneryville
36
¿Por qué tantos votos a favor? La pregunta dice que dos veces OP no quiere usar un marco externo y menciona explícitamente que no quiere Log4net. Seguramente esto debería ser un comentario, no una respuesta.
RyanfaeScotland
9
@RyanfaeScotland Tienes razón, tal vez no sea adecuado para OP, pero no olvides que este es un sitio público. Dado que el título de la pregunta solo dice "Cómo iniciar sesión en c #", también las personas como yo que están de acuerdo con el uso de cualquier biblioteca llegarán aquí y encontrarán esta respuesta útil. De hecho, este hilo fue el primer resultado cuando busqué en Google "c # logging".
swenzel
18

Puede escribir directamente en un registro de eventos. Consulte los siguientes enlaces:
http://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

Y aquí está la muestra 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
fuente
1
¿Cuál es la mejor práctica para usar el mismo EventLog en diferentes clases? ¿Pasarlo como parámetro en Constructor? ¿Acceder a él estáticamente desde alguna clase singleton? ¿O algo mejor?
dpelisek
15

Si está buscando una forma realmente simple de iniciar sesión, puede usar este revestimiento. Si el archivo no existe, se crea.

System.IO.File.AppendAllText(@"c:\log.txt", "mymsg\n");
vive el amor
fuente
El problema con esta solución es que agrega operación IO. Por lo tanto, no se recomienda su uso para registrar operaciones de algoritmos por lotes
Rami Yampolsky
@RamiYampolsky, no entiendo a qué te refieres.
dan-gph
@ dan-gph Si implementa algún código que está realizando muchas operaciones de CPU, en caso de que se registre durante este código, "perderá" algo de tiempo que es para registrar en lugar del algoritmo real que intenta implementar. Por lo que prefiere "perder" el menor tiempo posible. Hacer una operación IO como en el ejemplo anterior es realmente largo, por lo que si tiene muchos comandos de registro en su código, ¡puede hacer que toda su ejecución sea 1000 veces más lenta!
Rami Yampolsky
@RamiYampolsky, acabo de hacer ese ciclo de código 100.000 veces y me tomó 10 segundos. Eso es 10,000 entradas de registro por segundo, que son 0.01 microsegundos por entrada. Si registró 10 cosas en 1 segundo, eso tomaría 0.1 microsegundos. Así que no, eso no es mucha sobrecarga.
dan-gph
@ dan-gph Mi respuesta relacionada con diferentes casos de uso. Intente hacer un bucle 100.000 veces que haga algunos cálculos para simplificar, simplemente haga sumar + = i y luego haga el registro. Pruébelo con y sin el registro
Rami Yampolsky
7

Solía ​​escribir mi propio registro de errores hasta que descubrí ELMAH . Nunca he podido conseguir que la parte de envío de correos electrónicos sea tan perfecta como lo hace ELMAH.

jonezy
fuente
Lo miraré, para mi razonamiento, consulte el comentario de mi empi.
IAdapter
ELMAH es tan sencillo que ni siquiera es divertido, literalmente puedes colocarlo y agregar algunas líneas a tu configuración web y está funcionando.
jonezy
También en términos de su requisito de saber cuándo su aplicación está a punto de / comenzando a explotar, encuentro que elmah es mejor que la mayoría de los demás debido a su capacidad para enviar correos electrónicos, por lo que siempre que el servidor esté activo, recibirá correos electrónicos de error de elmah.
jonezy
6

Si desea permanecer cerca de .NET, consulte el Bloque de aplicaciones de registro de biblioteca empresarial . Mira aquí . O para un tutorial de inicio rápido, consulte esto . He utilizado la aplicación de validación Block de la biblioteca empresarial y realmente se adapta a mis necesidades y es muy fácil de "heredar" (¡instalarla y consultarla!) En su proyecto.

Bernoulli IT
fuente
4

Si desea su propio registro de errores personalizado, puede escribir fácilmente su propio código. Te daré un fragmento de uno de mis proyectos.

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

Luego, para escribir realmente en el registro de errores, simplemente escriba ( qsiendo la excepción detectada)

SaveLogFile(MethodBase.GetCurrentMethod(), `q`);
MisdartedPingüino
fuente
7
¿Sabe que se perderá la primera entrada cuando el archivo aún no existe?
2013