Tengo una solución que consiste en una aplicación principal de winforms, con DLL de biblioteca de clases internamente asociadas desde las cuales deseo iniciar sesión. Este registro debe ser realizado por el mismo registrador, independientemente de si el cliente de UI principal o el dll asociado lo llama. El dll puede, por supuesto, ser utilizado por otras aplicaciones que tienen diferentes registradores en otras soluciones, pero en estas circunstancias tendrá una configuración log4net diferente y tal vez un conjunto diferente de complementos en total.¿Cuál es el mejor patrón para usar el mismo registrador Log4net en muchos ensambles en una solución?
Un enfoque sería crear un singleton dentro de la aplicación principal y el registro de eso, sin embargo desde log4net es su propio singleton, que se puede referenciar siempre que pasemos la misma cadena (o tipo) a log4net.LogManager.GetLogger
lo haremos iniciar sesión en el mismo destino (en mi caso, deseo utilizar un RollingFileAppender).
Esto funciona. Sin embargo, dado que el DLL tendrá varias clases, significaría que cada instancia de clase o clase estática a partir de la cual deseamos iniciar sesión requeriría i) un argumento que defina el nombre del registrador (para iniciar sesión en el mismo destino) y ii) en cada punto de entrada necesitaría llamar al log4net.LogManager.GetLogger(loggerName)
.
¿Cuál es el mejor patrón para usar aquí? ¿El enfoque correcto sería crear una instancia única en cada ensamblado? Mi preocupación aquí es que todavía tendremos que pasar el nombre del registrador a cada punto de entrada para el dll, lo que parece exagerado. Para evitar pasar el nombre del registrador, podría suponer que siempre es igual a System.Reflection.Assembly.GetCallingAssembly().GetName().Name
.
Si esto es demasiado difícil para log4net, ¿hay otras soluciones más sencillas, como Enterprise Logging Block? ¿O es la mejor solución un enfoque de programación orientada a aspectos (AOP)?
Reference for anti-pattern approach for singleton here.
En mi pregunta original, decidí que gran parte de lo que deseaba registrar era en realidad retroalimentación de progreso, así que publiqué los eventos consumidos por la aplicación principal, pero su explicación aquí es de lejos la más clara, y también la he usado en otros lugares. – Topdown
Estoy leyendo esto 6 años después, así que no, ¡nunca demasiado tarde! :-) – nashwan