log4net - imagenes - en html, el atributo alt se emplea para
La configuraciĆ³n de Log4net del atributo de ensamblaje no carga el archivo de configuraciĆ³n (6)
Arreglo esto agregando el RepositoryAttribute al archivo AssemblyInfo.cs del ensamblado ofensivo.
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: RepositoryAttribute("Your.Namespace.Here")]
Tengo el siguiente archivo Log4net.config en mi directorio bin:
<?xml version="1.0" encoding="utf-8" ?>
<log4net xmlns="urn:log4net">
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<param name="file" value="MyLogFile.log"/>
<param name="appendToFile" value="false"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date (%logger) [%5level] - %message" />
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date (%logger) [%5level] - %message" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="FileAppender" />
<appender-ref ref="ConsoleAppender"/>
</root>
<logger name="NHibernate" additivity="false">
<level value="WARN"/>
</logger>
</log4net>
Y el siguiente código en mi archivo AssemblyInfo.cs:
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyTitle("My Project")]
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net.config", Watch = true)]
Cuando ejecuto el programa, obtengo el siguiente resultado de depuración de log4net:
log4net: log4net assembly [log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821]. Loaded from [D:/Data/Projects/Active/Clients/MyProject/src/MyProject.Importer/bin/Debug/log4net.dll]. (.NET Runtime [4.0.30319.1] on Microsoft Windows NT 6.1.7600.0)
log4net: DefaultRepositorySelector: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: DefaultRepositorySelector: Creating repository for assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null]
log4net: DefaultRepositorySelector: Assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null] Loaded From [D:/Data/Projects/Active/Clients/MyProject/src/MyProject.Importer/bin/Debug/MyCompany.Framework.dll]
log4net: DefaultRepositorySelector: Assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: DefaultRepositorySelector: Assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: DefaultRepositorySelector: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
The thread ''vshost.RunParkingWindow'' (0xd30) has exited with code 0 (0x0).
The thread ''<No Name>'' (0x15d0) has exited with code 0 (0x0).
log4net: Hierarchy: Shutdown called on Hierarchy [log4net-default-repository]
Log4net se carga, pero no parece estar procesando mi archivo de configuración. Cuando comento el atributo en AssemblyInfo.cs y ejecuto el siguiente código durante la inicialización de mi programa, funciona como se esperaba:
var log4netConfig = "Log4net.config";
var log4netInfo = new FileInfo(log4netConfig);
log4net.Config.XmlConfigurator.ConfigureAndWatch(log4netInfo);
¿Qué estoy haciendo mal? Quiero cargar desde AssemblyInfo.cs.
Estoy usando las secciones Web.Config para configurar Logger y registrar eventos manualmente, Bootstrapping Logger from global.asax
static ILog logger = LogManager.GetLogger(<LoggerName>);
protected void Application_Start()
{
log4net.Config.XmlConfigurator.Configure();
}
Intenta arrancarlo desde global.asax
Finalmente, acabo de encontrar la solución simple, puede obtener ayuda allí.
Global.asax en la función de inicio
protected void Application_Start() { log4net.Config.XmlConfigurator.Configure(); }
En cualquiera de las clases donde se utiliza el registro a nivel de clase
agregar espacio de nombres
using log4net;
añadir esta línea de código a nivel de clase
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
usar la función de registro en cualquiera de las llamadas de acción
log.Error("test error q111..");
configuración
<configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net " /> </configSection> <log4net debug="true"> <!--AdoNet appender is use for write log file into sql server--> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="1" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="Data Source=DESKTOP-NLH31FH; Initial Catalog=SmallBizDb;Integrated Security=true" providerName="System.Data.SqlClient" /> <commandText value="INSERT INTO [dbo].[Logs] ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@logdate,@thread, @loglevel, @logger, @message, @exception)" /> <parameter> <parameterName value="@logdate" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@loglevel" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value="@exception" /> <dbType value="String" /> <size value="2000" /> <layout type="log4net.Layout.ExceptionLayout" /> </parameter> </appender> <!--Add appender which you want to use, You can add more then one appender . Like if you want save log both plain text or sql server ,Add both appender.--> <root> <level value="Debug" /> <!--<appender-ref ref="RollingLogFileAppender" />--> <!--Enable this line if you want write log file into plain text file--> <appender-ref ref="AdoNetAppender" /> <!--Enable this line if you want write log file into sql server--> </root> </log4net> <appSettings> <add key="log4net.Internal.Debug" value="true"/> </appSettings> </configuration>
Puede ayudar a todos y fácil de usar. Gracias
Sigo log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config")));
en Global.asax.cs dentro de Application_Start () ... Así que no necesito llevar el comando por todos los lugares.
También tengo problemas con este método de boostrapping log4net. La documentation indica que debe realizar una llamada desde el inicio de la aplicación.
Si usa atributos de configuración, debe invocar log4net para permitirle leer los atributos. Una simple llamada a LogManager.GetLogger hará que los atributos en el ensamblaje llamante se lean y procesen. Por lo tanto, es imperativo realizar una llamada de registro tan pronto como sea posible durante el inicio de la aplicación, y sin duda antes de que se haya cargado e invocado cualquier ensamblaje externo.
Intente colocar un registrador en la misma clase que inicia su aplicación (program.cs, app.xaml, lo que sea). Por ejemplo
private static readonly ILog Log = LogManager.GetLogger(typeof(Program));
Y para hacer una patada, haga cualquier llamada al registro (incluso una que se filtre o evalúe fuera del proceso de adición, debe forzar a log4net a evaluar su repositorio / jerarquía).
static Program()
{
Log.Debug("Application loaded.");
}
var log4NetPath = Server.MapPath("~/log4net.config");
FileInfo fileInfo = new FileInfo(log4NetPath);
XmlConfigurator.ConfigureAndWatch(fileInfo);