c# - log - app.config para una biblioteca de clases
log4net install (8)
De hecho, la biblioteca de clases que está implementando está recuperando información de app.config dentro de la aplicación que la consume, por lo que la forma más correcta de implementar la configuración para las bibliotecas de clases en .NET en VS es preparar app.config en el aplicación para configurar todo lo que consume, como la configuración de bibliotecas.
He trabajado un poco con log4net, y descubrí que el que preparó la aplicación siempre tenía una sección para la configuración de log4net dentro de la aplicación principal.config.
Espero que encuentre esta información útil.
Nos vemos y publicamos comentarios sobre la solución que encontraste.
EDITAR:
En el siguiente enlace tiene una app.config con la sección para log4net:
http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx
No puedo ver un archivo app.config generado para una biblioteca de clases por el asistente VS2008. En mi investigación, descubrí que en una aplicación solo existe una aplicación.config.
¿Es malo agregar manualmente un app.config a una biblioteca de clases o hay algún otro método que sirva para un app.config en la biblioteca de clases?
Necesito almacenar la información de configuración de log4net dentro del archivo app.config.
Desea agregar App.config a su biblioteca de clases de prueba , si está utilizando un trazador / registrador. De lo contrario, nada se registra cuando ejecuta la prueba a través de un corredor de prueba como TestDriven.Net.
Por ejemplo, uso TraceSource
en mis programas, pero la ejecución de pruebas no registra nada a menos que también agregue un archivo App.config con la configuración de seguimiento / registro a la biblioteca de la clase de prueba.
De lo contrario, agregar App.config a una biblioteca de clases no hace nada.
En realidad, en algunos casos excepcionales, puede almacenar app.config en bibliotecas de clase (agregando manualmente) y analizarlo mediante OpenExeConfiguration .
var fileMap =
new ExeConfigurationFileMap {ExeConfigFilename =
@"C:/..somePath../someName.config"};
System.Configuration.Configuration config =
ConfigurationManager.OpenMappedExeConfiguration(fileMap,
ConfigurationUserLevel.None);
Realmente deberías estimar la necesidad real de esto. ¡Para datos abstractos no es la mejor solución, pero "Secciones de configuración" podría ser muy útil!
Por ejemplo, organizamos nuestra arquitectura N-Tier WCF desacoplada, sin ningún metadato, simplemente usando Unity Container e Injection Factory basados en Channel Factory T. Añadimos externall ClassLibrary dll con solo [Service Contract] Interfaces y app.config común en orden para leer puntos finales de la sección clientes, y agregarlos / cambiarlos fácilmente en un solo lugar.
Jon, se ha dado mucha opinión que no respondía correctamente a tu pregunta.
Daré MI OPINIÓN y luego te diré cómo hacer exactamente lo que pediste.
No veo ninguna razón por la que un ensamblado no pueda tener su propio archivo de configuración. ¿Por qué el primer nivel de atomicidad (es una palabra real?) ¿Está en el nivel de aplicación? ¿Por qué no a nivel de solución? Es una decisión arbitraria, con la mejor decisión, y como tal, una OPINIÓN. Si tuviera que escribir una biblioteca de registro y deseara incluir un archivo de configuración para ella, que se usaría de forma global, ¿por qué no podría conectarla a la funcionalidad de configuración incorporada? Todos lo hemos hecho ... intentado proporcionar funcionalidad "potente" a otros desarrolladores. ¿Cómo? Al hacer suposiciones que se traducen intrínsecamente a restricciones. Eso es exactamente lo que MS hizo con el marco de configuración, por lo que tienes que "engañarlo" un poco.
Para responder directamente a su pregunta, simplemente agregue el archivo de configuración manualmente (xml) y asígnele un nombre para que coincida con su biblioteca e incluya la extensión "config". Ejemplo:
MyDomain.Mylibrary.dll.Config
A continuación, use ConfigurationManager para cargar el archivo y acceder a la configuración:
string assemblyPath = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath;
Configuration cfg = ConfigurationManager.OpenExeConfiguration(assemblyPath);
string result = cfg.AppSettings.Settings["TEST_SETTING"].Value;
Tenga en cuenta que esto es totalmente compatible con machine.config heierarchy, aunque haya elegido explícitamente el archivo de configuración de la aplicación. En otras palabras, si la configuración no está allí, se resolverá más alto. La configuración también anulará las entradas de machine.config.
No sé por qué esta respuesta aún no se ha dado:
Las diferentes personas que llaman de la misma biblioteca, en general, usarán diferentes configuraciones. Esto implica que la configuración debe residir en la aplicación ejecutable , y no en la biblioteca de clases.
Puede crear un app.config dentro del proyecto de biblioteca de clase. Contendrá configuraciones predeterminadas para los elementos que cree dentro de la biblioteca. Por ejemplo, contendrá cadenas de conexión si crea un modelo de Entity Framework dentro de la biblioteca de clases.
Sin embargo, estas configuraciones no serán utilizadas por la aplicación ejecutable llamando a la biblioteca. En su lugar, estas configuraciones se pueden copiar desde el archivo library.dll.config en la aplicación.config o web.config de la persona que llama, de modo que se pueden cambiar para que sean específicos de la persona que llama, y para el entorno en el que se encuentra la persona que llama desplegada.
Así es como ha sido con .NET desde el día 1.
No se agrega automáticamente el archivo app.config cuando agrega un proyecto de biblioteca de clases a su solución.
Que yo sepa, no hay una contraindicación para hacerlo de manera manual. Creo que este es un uso común.
Acerca de la configuración de log4Net, no tiene que poner la configuración en app.config, puede tener un archivo conf dedicado en su proyecto y un archivo app.config al mismo tiempo.
este enlace http://logging.apache.org/log4net/release/manual/configuration.html le dará ejemplos sobre ambos modos (sección en app.config y archivo log4net conf independiente)
Si desea configurar su registro de proyecto utilizando log4Net, mientras utiliza una biblioteca de clases, no existe una necesidad real de ningún archivo de configuración. Puede configurar su registrador log4net en una clase y puede usar esa clase como biblioteca.
Como log4net ofrece todas las opciones para configurarlo.
Por favor encuentre el código a continuación.
public static void SetLogger(string pathName, string pattern)
{
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
PatternLayout patternLayout = new PatternLayout();
patternLayout.ConversionPattern = pattern;
patternLayout.ActivateOptions();
RollingFileAppender roller = new RollingFileAppender();
roller.AppendToFile = false;
roller.File = pathName;
roller.Layout = patternLayout;
roller.MaxSizeRollBackups = 5;
roller.MaximumFileSize = "1GB";
roller.RollingStyle = RollingFileAppender.RollingMode.Size;
roller.StaticLogFileName = true;
roller.ActivateOptions();
hierarchy.Root.AddAppender(roller);
MemoryAppender memory = new MemoryAppender();
memory.ActivateOptions();
hierarchy.Root.AddAppender(memory);
hierarchy.Root.Level = log4net.Core.Level.Info;
hierarchy.Configured = true;
}
Ahora, en lugar de llamar a XmlConfigurator.Configure (new FileInfo ("app.config")) puede llamar directamente a SetLogger con la ruta y el patrón deseados para configurar el registrador en la función de inicio de la aplicación Global.asax.
Y use el siguiente código para registrar el error.
public static void getLog(string className, string message)
{
log4net.ILog iLOG = LogManager.GetLogger(className);
iLOG.Error(message); // Info, Fatal, Warn, Debug
}
Al usar el siguiente código, no necesita escribir una sola línea ni en la aplicación web.config ni dentro de la aplicación.config de la biblioteca.
Por lo general, no debe agregar un archivo app.config
a un proyecto de biblioteca de clase; no se usará sin una dolorosa flexión y torsión de su parte. No perjudica en nada el proyecto de la biblioteca, simplemente no hará nada en absoluto.
En cambio, configura la aplicación que está utilizando su biblioteca; por lo que la información de configuración requerida iría allí. Cada aplicación que pueda usar su biblioteca probablemente tendrá diferentes requisitos, por lo que esto también tiene sentido lógico.