2010-07-29 9 views
5

en nuestro proyecto actual decidimos utilizar la biblioteca empresarial para el registro, hasta ahora solo usamos log4net, pero no puedo encontrar ningún consejo sobre cómo usar realmente la biblioteca de manera flexible, lo que quiero decir es en log4net esta sería la forma:patrón para iniciar sesión utilizando la biblioteca empresarial

//define this in MyClass 
private static readonly ILog log = LogManager.GetLogger(typeof(MyClass)); 
//and than in the methods you can call it like this 
log.Info("info message"); 

esto me permitiría ir a la aplicación más tarde y por chainging configuración podría dar vuelta info/advertir levelels para clases particulares sin tocar la aplicación.

La única muestra de la biblioteca de registro es básicamente el siguiente:

LogEntry logEntry = new LogEntry(); 
logEntry.EventId = 100; 
logEntry.Priority = 2; 
logEntry.Message = "Informational message"; 
logEntry.Categories.Add("Trace"); 
logEntry.Categories.Add("UI Events"); 
Logger.Write(logEntry); 

pero de lo que estaría obligado a filtrar en función de algunas cadenas con los errores tipográficos y similares, y todos los desarrolladores introduciría su categoría-tokens, lo que es la mejor manera de limitar esto, cuáles son las mejores prácticas sobre la construcción de mensajes, en otra solución de arriba no es muy amigable para el desarrollador requerir 10 líneas para un solo mensaje de registro, usar algunos métodos estáticos para una solución completa reduciría la flexibilidad en el filtrado, entonces ¿qué es? la mejor manera de usar el registro?
¿Encontró algún patrón significativo de cómo usarlo?

gracias Almir

Respuesta

4

Sus toques de interrogación en uno de los "problemas" de Enterprise Library. Claro, simplemente funciona (con algunos dolores de cabeza de configuración por lo general), pero si quieres algo con un poco de estructura, no está allí. Además, no hay mucha orientación por parte de Microsoft.

Esto es lo que yo haría:

  • me gustaría añadir una fachada al bloque de registro que le permite controlar la forma en que desea registrar sus datos. es decir, si no desea que los desarrolladores creen sus propias categorías, solicite a su fachada que realice una enumeración (puede marcarla como Indicadores para permitir múltiples categorías).

  • Me deshago de Priority ya que no creo que se compre demasiado teniendo en cuenta que también tiene Severity y Category para filtrar.

  • También es posible que desee agregar sobrecargas para admitir Excepciones y resultados de validación (si está utilizando el Bloque de aplicaciones de validación).

  • Otra característica que quizás desee tener es agregar el nombre de la clase como categoría para admitir el registro de clases particulares. Puede hacer que los desarrolladores pasen el nombre de la clase o puede determinarlo a través de la reflexión. Yo prefiero que pasa en

Por lo que podría hacer algo como esto:.

[Flags] 
public enum EventDataTypeCategory 
{  
    None = 0x0, 
    Failure = 0x1, 
    Error = 0x2 , 
    Warning = 0x4, 
    Information = 0x8, 
    Debug = 0x10, 
    Trace = 0x20, 
    UIEvents = 0x40, 
    DataAccess = 0x80 
} 

public static void LogMessage(string message, string className, int eventId, 
    EventDataTypeCategory categories) 
{ 
    // Create LogEntry 
    LogEntry logEntry = new LogEntry(...); 

    // Add all categories 
    foreach (EventDataTypeCategory enumValue in System.Enum.GetValues(typeof(EventDataTypeCategory))) 
    { 
     if ((enumValue & categories) == enumValue) 
     { 
      logEntry.Categories.Add(enumValue.ToString()); 
     } 
    } 

    if (className != null) 
    { 
     logEntry.Categories.Add(className); 
    } 

    ... 

    Logger.Write(logEntry); 
} 

Entonces se le puede llamar así:

public class MyClass 
{ 
    private static readonly string ClassName = typeof(MyClass).FullName; 

    public void DoSomething() 
    { 
     MyLogger.LogMessage("I'm going to DoSomething now!", 
      ClassName, 
      1001, 
      EventDataTypeCategory.Trace | EventDataTypeCategory.UIEvents); 
    } 
} 

Si eso es todavía demasiados argumentos a continuación, puede tener una sobrecarga que toma menos parámetros y proporciona valores predeterminados para los otros valores. p.ej. si no le importa el valor predeterminado de EventID, 0.

0

En realidad, no responder a su pregunta, pero acabó creando mi propio sistema de registro.

Lo único que tiene que hacer es:

Log.Instance.Add("This is a message"); 

Todos los demás usos más complejos se realizan a través de diferentes métodos o con sobrecargas, por ejemplo:

Log.Instance.AddFormat("My favourite number is {0}", 42); 

O

Log.Instance.Add("This is an important message", LogLevel.Critical); 

Honestamente, todavía tengo que encontrar un caso en el que todas las supercomplicaciones de Lo El registro de g4Net y Enterprise es realmente necesario o deseable.

Para obtener más información, ver perfil (que es parte de la SixPack library)

Cuestiones relacionadas