una sublime notas mostrar insertar img imagen etiqueta desde como carpeta bloc .net vb.net logging

.net - sublime - ¿Cuál es el mejor enfoque para el registro?



insertar imagen html5 (5)

Mi aplicación (local, windows / mono) registra eventos importantes en un archivo de texto. En caso de una falla repentina / falla / salida forzada, los datos no deben permanecer sin escribir (en la medida de lo posible). Por lo tanto, actualmente utilizo un enfoque simple de agregar texto al archivo:

Public Shared Sub LogAppEvent(ByVal EventData As String) Dim Config As ConfigHandler = ConfigHandler.GetSingleton() Dim AppLog As New IO.StreamWriter(Config.GetUserFilesRootDir() & ConfigOptions.AppLogName, True) AppLog.WriteLine(String.Format("[{0}] {1}", Date.Now.ToString(), EventData)) AppLog.Close() End Sub

Esto es muy poco óptimo, pero los eventos de registro son bastante raros. ¿Recomendaría cambiarse a la clase de registro System.Diagnostics ?

¿O tal vez sugerirías otra solución?


Sí, puede considerar System.Diagnostics. Siempre que no esté escribiendo una gran cantidad de eventos, la ventaja del Registro de eventos de Windows es que los administradores tienen un lugar para buscar todos los eventos de todas las aplicaciones.

Aquí hay un código de VB.NET que puede ayudarte si decides seguir esta ruta:

Imports System.Diagnostics Public Function WriteToEventLog(ByVal Entry As String, _ Optional ByVal AppName As String = "VB.NET Application", _ Optional ByVal EventType As _ EventLogEntryType = EventLogEntryType.Information, _ Optional ByVal LogName As String = "Application") As Boolean ''************************************************************* ''PURPOSE: Write Entry to Event Log using VB.NET ''PARAMETERS: Entry - Value to Write '' AppName - Name of Client Application. Needed '' because before writing to event log, you must '' have a named EventLog source. '' EventType - Entry Type, from EventLogEntryType '' Structure e.g., EventLogEntryType.Warning, '' EventLogEntryType.Error '' LogName: Name of Log (System, Application; '' Security is read-only) If you '' specify a non-existent log, the log will be '' created ''RETURNS: True if successful, false if not ''EXAMPLES: ''1. Simple Example, Accepting All Defaults '' WriteToEventLog "Hello Event Log" ''2. Specify EventSource, EventType, and LogName '' WriteToEventLog("Danger, Danger, Danger", "MyVbApp", _ '' EventLogEntryType.Warning, "System") '' ''NOTE: EventSources are tightly tied to their log. '' So don''t use the same source name for different '' logs, and vice versa ''****************************************************** Dim objEventLog As New EventLog() Try ''Register the App as an Event Source If Not objEventLog.SourceExists(AppName) Then objEventLog.CreateEventSource(AppName, LogName) End If objEventLog.Source = AppName ''WriteEntry is overloaded; this is one ''of 10 ways to call it objEventLog.WriteEntry(Entry, EventType) Return True Catch Ex As Exception Return False End Try End Function


Nlog y log4Net son opciones populares para iniciar sesión en proyectos .net.


Como se mencionó anteriormente, NLog y log4net son buenos marcos de registro. Como menciona Jeff anteriormente, System.Diagnostics también es una opción razonable (para más que simplemente iniciar sesión en EventLog). Tratando de agregar algo de valor a mi respuesta, en lugar de solo repetir lo que ya se ha dicho, puede mejorar su registro System.Diagnostics utilizando TraceSources y utilizando la libre biblioteca Ukadc.Diagnostics de codeplex .

Con TraceSources puede crear "registradores con nombre", similar a cómo puede hacerlo en NLog y log4net. Estos TraceSources se pueden configurar para que se registren en ciertos niveles (variando según TraceSource) y se pueden enviar a varios destinos (TraceListeners). Todos los TraceSources pueden iniciar sesión en el mismo oyente, o algunos pueden iniciar sesión en algunos oyentes, mientras que otros pueden iniciar sesión en otros oyentes. Cualquier TraceSource también se puede enviar a múltiples TraceListeners.

Así es como usaría TraceSources en el código (suponiendo que TraceSource "abc" se ha configurado en el archivo app.config para registrar "Información" y mensajes de mayor prioridad y se ha configurado para iniciar sesión en el archivo "log.txt").

public class MyClass { static TraceSource ts = new TraceSource("abc"); //Common idiom for NLog and log4net, not sure if as common for TraceSource public void Func1(int x) { ts.Information("Entering Func1"); ts.Verbose("x = {0}", x); //Won''t log if "abc" is configured to log Info and HIGHER messgaes ts.Information("Exiting Func1"); } }

Una gran ventaja de Ukadc.Diagnostics, sobre TraceSources "simples", es que puede configurar el formato de salida del estilo NLog / log4net para que pueda tener mucho más control sobre qué campos aparecen en su salida de registro y qué formato.

Tres cosas que son bastante útiles desde NLog / log4net que no están disponibles en System.Diagnostics son:

  1. Posibilidad de registrar automáticamente la información del sitio de llamadas (método / función)

  2. Contexto de registro adicional (GDC - propiedades de registro global, MDC - propiedades de registro de hilos en el lenguaje NLog / log4net). System.Diagnostics tiene Trace.CorrelationManager.LogicalOperationStack, que es similar a NDC.

  3. Loggers Hierarichal.

Los registradores jerárquicos significa que puede configurar un registrador "ancestro" y cualquier registrador "descendiente" heredará esa configuración. Por ejemplo, supongamos que tiene una clase cuyo nombre de tipo calificado completo (espacio de nombres) es Namespace1.Namespace2.Class. Con NLog / log4net puede configurar la información de registro (nivel, destino) para "Namespace1" y si solicitó un logger basado en el nombre completo de cualquier tipo en Namespace1, heredaría la configuración de Namespace1. Puede lograr algo similar a esto usando TraceSources al observar cómo Castle implementó su abstracción de registro basada en TraceSource . En particular, mira la función Inicializar. Es bastante fácil trabajar (en su propia envoltura delgada alrededor de TraceSource) y, como beneficio adicional, hace que la configuración de sus TraceSources sea un poco más fácil ya que no tiene que configurar cada uno de los TraceSource individualmente. Tenga en cuenta que puede agregar fácilmente la capacidad de tener una configuración "raíz" configurando un TraceSource llamado " " y agregando algún código en el esquema de Castle a la configuración predeterminada " " si no se encuentran antepasados ​​reales. Podría, por ejemplo, configurar "*" para iniciar sesión, decir Detallado, y luego configurar específicamente TraceSources (por clase o por espacio de nombres) para estar desactivado o en un nivel diferente. Sin los registradores jerárquicos, hacer lo mismo con TraceSources requeriría que configurara cada TraceSource para iniciar sesión en "Verbose" que desee en verbose.

Mientras hablé mucho sobre los registradores para clases y espacios de nombres, NLog, log4net y TraceSources también le permiten definir sus nombres de registrador como cadenas arbitrarias. Como tal, define en frío una jerarquía de registrador por área funcional en lugar de por espacio de nombres / clase:

Database Database.Connect Database.Query Database.Update Database.SQL Amazon Amazon.Books Amazon.Books.Fiction Amazon.Books.Nonfiction Amazon.Electronics Amazon.Electronics.Video Amazon.Electronics.Music Amazon.Electronics.Computer

Por lo tanto, podría activar el registro de "Amazon" y todo el registro de cosas de Amazon (sin tener que configurar explícitamente cada uno de los "hijos" de TraceSource) y las cosas de la base de datos no lo harían. O bien, podría activar Amazon y Amazon.Electronics y solo se registrarían los Amazon.Books (y los secundarios).

Finalmente, si vas con NLog o log4net, vale la pena mencionar que NLog acaba de lanzar una nueva versión, NLog 2.0, (en beta).


Utilizo la variable pública y el temporizador añadiendo nuevas líneas al archivo txt.

P.ej

Public Class Form1 Public WriteToLog = "" Dim LogFilePath As String = My.Application.Info.DirectoryPath & "/applog.txt" .... Public Function Log_to_txt(ByVal text As String) Dim CurDate As String CurDate = Format(Now, "General Date") WriteToLog = WriteToLog & "[" & CurDate & "] " & text & vbCrLf Return True End Function ... Log_to_txt("Application started...") ... Private Sub WriteToLogTimer_Tick(sender As Object, e As EventArgs) Handles WriteToLogTimer.Tick Dim CatchLog As String = WriteToLog WriteToLog = "" Try My.Computer.FileSystem.WriteAllText(LogFilePath, CatchLog, True) Catch ex As IOException End Try End Sub


Si un enfoque súper básico como este es funcionalmente suficiente para sus necesidades, puede seguir con él. Pero, puedes hacerte algunas preguntas para asegurarte de que:

  • ¿Es posible que los eventos se registren simultáneamente por varios hilos? Esta función no es segura para los hilos

  • ¿Se necesita notificación de error?

  • ¿Existe el riesgo de que los archivos de registro crezcan sin límites sin una eliminación automática?

  • ¿Te beneficiarías de un registro más extenso para que tengas más información sobre los eventos que conducen a un error?

  • ¿Te beneficiarías de más detalles sobre los errores (rastro de la pila, detalles de excepción, etc.)?

  • ¿Su programa se ejecuta en múltiples computadoras? Si es así, ¿cómo le llegan los registros?

  • ¿Hay alguna necesidad / valor en las herramientas para ayudar a analizar los archivos de registro (ya sea de forma individual o encontrar patrones tales como errores comunes en muchos archivos de registro)?

Si decide que tiene otros requisitos, existen varios marcos de registro gratuitos como NLog o log4net que pueden ayudar a registrar registros más detallados, y hay varios productos comerciales disponibles, como GIBRALTAR y SmartInspect, que pueden ayudar con la administración y el análisis de registros. .