Hablaré principalmente desde la perspectiva del uso de la abstracción para aislar el código de la aplicación de un marco de registro particular. Hay otros factores que pueden afectar la elección de un marco de trabajo de registro o la elección de uno (y los requisitos para) una abstracción.
He pasado mucho tiempo evaluando recientemente diversos marcos de trabajo de registro, así como abstracciones de registro de terceros.
Algunas personas sienten que es útil aislar su código de aplicación de un marco de registro específico. Encontrará muchas publicaciones aquí en SO como this y this y this (y hay más) donde se discute el registro y muchas personas lo toman como una cuestión de que el marco de registro debe ser envuelto/abstraído.
Obviamente, esto le permite no estar atado a un marco específico. ¿Es esto importante? ¿Realmente cambiarás tu marco de trabajo? Bueno, también hay muchas personas que no mencionan envolver o que recomiendan no hacerlo. Si nos fijamos en algunos de los ejemplos del código de envoltura del marco de registro que se ha publicado aquí, también puede ver muchos ejemplos de por qué algunas personas no deberían envolver su marco de registro.
Si ha iniciado un proyecto recientemente, es posible que haya examinado los marcos de registro y, tal vez, lo haya reducido a dos finalistas: log4net y NLog. Cada uno tiene argumentos a su favor. log4net es claramente un favorito, probablemente EL favorito de aquellos que han expresado una opinión. NLog proporciona capacidades muy similares. A juzgar por la popularidad, log4net podría ser la opción más clara. Según las capacidades, parecen muy similares. En función de la "actividad reciente" (como lo indican los registros de sus repositorios de código fuente por actividad del blog o la falta de ellos), NLog será la opción más clara. Si tuvo que elegir hace un año, puede ir con log4net ya que sería la opción "segura". No estaba claro cuándo se lanzaría NLog. En el año transcurrido desde entonces, NLog ha pasado por un ciclo de desarrollo bastante significativo, lanzando una versión beta hace unos días.
¿Qué elegir hace un año? ¿Qué elegir ahora? ¿Fue una opción claramente mejor entonces? ¿Una es la mejor opción ahora?
Una cosa que una abstracción le proporciona es la capacidad de posponer la decisión de cuál elegir (ni siquiera necesariamente TIENE que elegir SIEMPRE, aunque es probable que desee hacerlo si planea entregar el marco de trabajo de registro con su producto). Puede probar una unidad y luego la otra y obtener una idea de cómo funcionan con su aplicación, con su equipo, en su entorno. Usar algo como Common.Logging o SLF le permite comenzar a escribir código ahora, codificando a alguna interfaz/API de registro y obteniendo su código de registro en su lugar. Si cree que la interfaz/API es provista por la abstracción es suficiente para su trabajo (y, por qué no sería, ya que es esencialmente lo mismo que la interfaz/API proporcionada por log4net y NLog), entonces no hay mucho peligro al usar la abstracción. A medida que avanza en el ciclo de desarrollo, puede encontrar que un marco u otro se adapta mejor a sus necesidades. Después de haber codificado la abstracción, puede elegir libremente en cualquier momento, hasta que su producto salga por la puerta.
Incluso podría pensar, en el fondo de su mente, que posiblemente podría escribir una biblioteca de registro desde cero. Nuevamente, si usted cree que la interfaz/API de log4net y/o NLog es suficiente, puede implementar su biblioteca de registro con una API similar. Si crees eso, esa podría ser otra razón para usar una abstracción. De nuevo, puede comenzar a escribir código (para su producto, no su biblioteca de registro) hoy, iniciando sesión con algún otro marco de registro hasta el momento en que su biblioteca de registro "desde cero" esté lista. Quizás desee utilizar System.Diagnostics.TraceSource y Ukadc.Diagnostics (para obtener capacidades de formato de salida similares a log4net o NLog) para que pueda obtener una "mejor" integración con el registro que Microsoft ha implementado en algunas de sus plataformas utilizando TraceSources. Podría ser muy fácil escribir un "registrador" en términos de TraceSources y luego escribir la abstracción para que pueda conectarlo a Common.Logging o SLF. (Si la interfaz/API es suficiente, puede simplemente escribir su "registrador" en términos de la interfaz de la biblioteca de abstracción y no tener que escribir una capa de abstracción adicional).
Con argumentos tan persuasivos como estos, ¿por qué alguien nunca usaría una abstracción? ¡Jaja solo bromeo!
Si una abstracción es buena, ¿debería escribir una propia o usar una ya existente? Si escribes uno por tu cuenta, obviamente tienes que escribirlo. ¿Cómo hace uno esto? Bueno, puedes definir una interfaz y ajustar un marco (¡ten cuidado y envuélvelo correctamente!). Más tarde, si decides que quieres cambiar, ajusta ese marco.Si tiene cuidado, no tiene que cambiar ningún código de aplicación, excepto tal vez el lugar donde realmente crea los objetos del marco subyacente. Quizás esto es bueno. Ha evitado una dependencia en la abstracción de un tercero por el precio "pequeño" de implementar un único contenedor en un marco único. Sin embargo, hay un costo. Hasta que haya escrito su abstracción, no podrá escribir mucho código de aplicación que tenga un inicio de sesión, a menos que tenga una buena estrategia para cambiarlo a su abstracción. También se vuelve más difícil probar dos o más marcos para decidir cuál funciona mejor para usted. Cada marco que desee "probar" requiere otro trabajo de ajuste. Si desea cambiar entre frameworks fácilmente (al menos durante el ciclo de desarrollo), tiene trabajo que hacer para hacerlo más fácil. Los marcos de terceros proporcionan esto fuera de la caja.
¡Guau! ¡Ahora estoy vendido! Dame la extracción de registros, o dame la muerte!
¿Las abstracciones de la extracción de registros son todas gravy? ¿Hay algún inconveniente? No pueden ESO genial, ¿verdad?
Bueno, como siempre, cuando "compras" algo o cuando obtienes algo gratis, obtienes lo que está disponible. Las abstracciones de extracción no son diferentes. Ni Common.Logging ni SLF exponen al menos un conjunto muy importante de capacidades de log4net/NLog - las capacidades de contexto de registro (GDC, MDC, NDC). Estos pueden ser clave para obtener la información adecuada registrada y formateada para que pueda obtener el máximo valor de su. SLF no proporciona una abstracción de TraceSource. Tampoco proporciona funciones habilitadas para IsXXX. Common.Logging proporciona una abstracción de TraceSource. Castle.Logging DOES expone GDC/MDC/NDC para log4net y NLog. También proporciona una abstracción de TraceSource. La abstracción TraceSource de Castle también mejora el registro de TraceSource al proporcionar una capacidad de nomenclatura "jerárquica", similar a la proporcionada por log4net y NLog. ¡Se ve muy bien!
Además, estos proyectos son todos de código abierto de una forma u otra. Entonces, dependiendo de la abstracción, los desarrolladores podrían tener más o menos un interés personal en mantenerlo actualizado y agregar nuevas características. Common.Logging ha pasado por algunas versiones y se utiliza, AFAIK, en Spring.Net. Parece razonablemente activo, al menos históricamente. Castle.Logging se usa en el marco Castle. Por lo tanto, aparentemente tienen clientes "reales" y están obteniendo un uso del "mundo real", lo que con suerte conducirá a más implementación de funciones. SLF, por lo que puedo decir, no se usa como parte de una plataforma de desarrollo "real", por lo que es difícil decir cuánto se ejerce.
No está claro cuál es la hoja de ruta para estas plataformas. Common.Logging tiene algunas características próximas enumeradas en su sitio web, pero no indica claramente cuándo estarán disponibles. El sitio web dice "junio", pero ¿de qué año? ¿Con qué frecuencia se monitorea la lista de correo? Para SLF, ¿con qué frecuencia se monitorea su codeplex? ¿Dónde se clasifica la prioridad de estos proyectos "gratuitos" en comparación con los empleos remunerados de los desarrolladores? ¿Puede permitirse una abstracción de terceros para implementar una característica que necesita? ¿Serán receptivos si implementan algo y luego lo envían nuevamente para que se incluya en el producto?
En el lado positivo, está disponible toda la fuente de todas estas abstracciones, por lo que podría asumir la responsabilidad y realizar cualquier corrección o agregar cualquier mejora que usted, sin tener que pasar por el tiempo y la energía de creando una abstracción desde cero. ¿Le gusta Common.Logging pero realmente quiere log4net/NLog GDC/MDC/NDC? Obtenga la implementación de Castle y agréguela a Common.Logging. Voila! Una abstracción de registro que contiene casi el 100% de la API de registro log4net/NLog. ¿Prefiere SLF pero desearía tener IsXXXEnabled? No hay mucho trabajo para implementar eso. Continúe y vire en el GDC/MDC/NDC mientras lo hace. ¿Te gusta Castle? (No estoy tan familiarizado con eso, no estoy seguro de lo fácil que es usarlo fuera de Castle, si eso es importante) Tenga cuidado, no lo he usado, pero mirando la fuente en git, parece que el registrador NLog abstracción podría no conservar la información del sitio de llamada.
¿Es ético tomar partes de múltiples proyectos de código abierto y combinarlos para hacer un proyecto "super" (para su propio uso o el de su compañía)? ¿Es malo tomar Common.Logging y aumentarlo con la implementación de Castle GDC/MDC/NDC? No lo sé. Dejaré que alguien más responda eso.
Estoy casi terminado ...
Algunos terceros abstracciones de registro Parte proporcione otras capacidades. Puede usar una biblioteca que se implemente en términos de, digamos log4net. Es posible que no desee usar log4net, o al menos no desee estar vinculado a él. Common.Logging (y tal vez SLF) hace que sea relativamente fácil para usted capturar los mensajes de log4net logging y redirigirlos a través de la abstracción para que sean capturados en la corriente de registro subyacente del marco de registro de la abstracción. SLF podría proporcionar algo similar. Por supuesto, es posible que pueda hacer algo similar con los marcos de registro existentes, ya sea de manera inmediata o escribiendo un apéndice log4net personalizado, NLog Target o System.Diagnostics TraceListener. Estas características no han brotado muy alto en mi evaluación particular de si usar o no una abstracción de registro de terceros en mi proyecto porque estoy interesado principalmente simplemente en el aspecto de la abstracción.
Entonces, ¿dónde estoy parado? Creo que tiene sentido mantener el código de su aplicación aislado de un marco de registro específico. Para mí, Common.Logging parece una opción sólida de abstracción, aunque faltan algunas características importantes (GDC/MDC/NDC) y no es compatible con Silverlight. Sería genial de esas características disponibles pronto. Me siento cómodo con la implementación de GDC/MDC/NDC si es necesario. Hacerlo compatible con Silverlight probablemente requeriría más esfuerzo, principalmente porque no tengo mucha experiencia con C# /. NET/Silverlight. Hasta que se solucionen esos problemas, podríamos escribir un montón de código de aplicación con Common.Logging en su lugar. Podemos dedicar nuestro tiempo a desarrollar nuestra aplicación en lugar de desarrollar otra biblioteca de registro o biblioteca de abstracción. Si terminamos teniendo que agregar esas características faltantes nosotros mismos, bueno, habríamos tenido que hacer mucho de eso si hubiésemos implementado una biblioteca de registro o una biblioteca de abstracción nosotros mismos.
http://www.joelonsoftware.com/articles/fog0000000018.html –
@brian No estoy seguro de que su suposición sobre la inclinación natural de las personas sea cierta. Insista en que la mayoría de los desarrolladores ni siquiera lo piensan. – Howiecamp