visual studio structured rolling name logger configuracion application file logging configuration log4net external

file - studio - log4net structured logging



La configuraciĆ³n de Log4Net en el archivo externo no funciona (11)

¿Tiene el siguiente atributo en su archivo AssemblyInfo.cs :

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

y un código como este al inicio de cada clase que requiere la funcionalidad de registro:

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Tengo una publicación de blog que contiene esta y otra información here .

Estamos usando log4net y queremos especificar su configuración en un archivo de configuración externo (como lo hemos hecho con otras secciones). Para hacer esto, hemos cambiado la sección log4net en App.config a:

... <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> ... <log4net configSource="Log.config" /> ...

Y en el archivo Log.Config (el mismo directorio que App.config) tenemos:

<log4net> <appender name="General" type="log4net.Appender.FileAppender"> <file value="myapp.log" /> <layout type="log4net.Layout.SimpleLayout" /> </appender> <root> <appender-ref ref="General" /> </root> </log4net>

Sin embargo, cuando ejecutamos la aplicación, no se crea ningún archivo de registro (y no se realiza ningún registro). No hay mensajes de error que se envíen a la consola.

Si movemos el contenido del archivo Log.config de nuevo a App.config (reemplazando la primera línea de código anterior), funciona como se esperaba. ¿Alguna idea de por qué no está funcionando en un archivo externo?


@Mitch, resulta que hay un archivo con la declaración [assembly: ...], pero no tenía la propiedad ConfigFile.

Una vez que lo agregué y lo apunté a Log.config, comenzó a funcionar. Hubiera pensado que funcionaría como todas las demás secciones de configuración (es decir, AppSettings) y aceptaría archivos de configuración externos sin modificaciones.

No tenemos la segunda declaración que mencionó, ya que la incluimos en un proveedor global de registros estáticos.


Asegúrese de que su archivo log4net.config esté configurado con las siguientes propiedades:

Crear acción: contenido

Copiar al directorio de salida: Copiar siempre


El paso que se ha perdido es

log4net.Config.XmlConfigurator.Configure();

esto hará que se use el configSource. Asegúrese de llamarlo una vez antes de llamar a GetLogger ();


En mi caso, recibí este mensaje de error:

log4net: config file [C:/......../bin/Debug/log4net.config] not found.

Y log4net.config el archivo estaba en el proyecto de Visual Studio 2017, pero cuando revisé el archivo en la carpeta bin/Debug no pude encontrarlo.

Mi configuración de ensamblaje original fue así:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

Después de un tiempo de investigación, lo cambio a lo siguiente y funciona:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"../../log4net.config", Watch = true)]


Hay un defecto abierto en este tema. Log4Net no es compatible con el atributo configSource de los elementos de configuración. Para usar una solución de archivo puramente de configuración, use la clave log4net.Config en appSettings.

Paso 1: Incluye la definición de la sección de configuración normal:

<configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections>

Paso 2: utiliza la clave mágica log4net.Config en appSettings.

<appSettings> <add key="log4net.Config" value="log4net.simple.config" /> </appSettings>

Paso 3: aporte un parche para corregir el manejo de configSource.


Suponiendo que tiene un archivo de configuración externo llamado log4net.config que se copia en su directorio de implementación, puede configurarlo así:

using System; using System.Collections.Generic; using System.Windows.Forms; using System.Reflection; using log4net; namespace MyAppNamespace { static class Program { //declare it as static and public so all classes in the project can access it //like so: Program.log.Error("got an error"); public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program)); /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { //configure it to use external file log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "//log4net.config")); //use it log.Debug("############# STARING APPLICATION #################"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormMain()); } } }


También es posible activar un modo de depuración para log4net . Inserta esto en el archivo App.config:

<appSettings> <add key="log4net.Internal.Debug" value="true"/> </appSettings> <system.diagnostics> <trace autoflush="true"> <listeners> <add name="textWriterTraceListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="link/to/your/file.log" /> </listeners> </trace> </system.diagnostics>

y al menos recibirá mensajes de error, de los cuales puede deducir exactamente qué salió mal. En mi caso, simplemente olvidé configurar Copy to output directory para Copy Always .


Ten cuidado con este problema ...

En mi caso, todo fue configurado correctamente. El problema es que utilicé Web Deploy dentro de Visual Studio 2013 para subir el sitio a WinHost.com y restablecer las ACLs en el servidor. Esto a su vez revocó todos los permisos en carpetas y archivos, log4net no pudo escribir el archivo.

Puedes leer más sobre esto aquí:

Cómo evitar que Web Deploy / MSBuild arruinen los permisos del servidor

Le pedí al equipo de soporte que restableciera las ACL y luego log4net comenzó a escupir registros. :)


Tuve el mismo problema, además de tener

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")]

en el proyecto en ejecución, también tuve la siguiente línea en un proyecto de referencia:

[assembly: log4net.Config.XmlConfigurator]

Cuando eliminé esta línea en los proyectos a los que se hace referencia, los registros comienzan a aparecer.


Ya sea uso,

<configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <appSettings> <add key="log4net.Config" value="Log4Net.config" /> </appSettings>

o solo,

log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config"));

En ambos casos, el archivo, Log4Net.config, debe estar allí en el directorio de salida. Puede hacer esto configurando las propiedades del archivo Log4Net.config en el explorador de soluciones. Crear acción - Contenido y copiar al directorio de salida - Copiar siempre