2010-10-19 20 views
21

tengo el siguiente archivo log4net.config en mi directorio bin:configuración Log4net de atributo de ensamblado no se carga el archivo de configuración

<?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 código siguiente 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, me sale el siguiente resultado de la depuración 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] 

cargas log4net, pero parece que no está procesando mi archivo de configuración. Cuando comento hacia fuera del atributo en AssemblyInfo.cs y ejecutar el siguiente código de inicialización durante mi programa, que 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.

Respuesta

30

También tengo problemas con este método de boostrapping log4net. El documentation dice que hay que hacer una llamada muy temprano en el inicio de la aplicación

si se utiliza la configuración de atributos que debe invocar log4net para que pueda leer los atributos. Una simple llamada a LogManager.GetLogger hará que se lean y procesen los atributos en el conjunto de llamadas. Por lo tanto, es imprescindible realizar una llamada de registro tan pronto como sea posible durante la puesta en marcha de la aplicación, y ciertamente antes de que se hayan cargado e invocado los ensamblados externos.

Pruebe 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 por diversión, hacer cualquier llamada en el registro (incluso uno que se filtra o se evalúa fuera del proceso de agregación, debe forzar log4net para evaluar su repositorio/jerarquía).

static Program() 
{ 
    Log.Debug("Application loaded."); 
} 
+3

Como siempre, verifique la salida del depurador interno log4net '' –

+0

Para una aplicación de servicio web, donde debe ser esto? – oliverdejohnson

+0

@oliverdejohnson Compruebe http://logging.apache.org/log4net/release/faq.html para ¿Cómo activo la depuración interna de log4net? muestra cómo configurar la depuración y un detector de rastreo. –

0

estoy usando secciones Web.config para configurar Logger y registrar manualmente eventos, Bootstrapping Logger de global.asax

static ILog logger = LogManager.GetLogger(<LoggerName>); 

protected void Application_Start() 
{ 
    log4net.Config.XmlConfigurator.Configure(); 
} 

intenta poder instalarla desde global.asax

3

Yo 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.

-1
var log4NetPath = Server.MapPath("~/log4net.config"); 

FileInfo fileInfo = new FileInfo(log4NetPath); 

XmlConfigurator.ConfigureAndWatch(fileInfo); 
+2

Necesita agregar algo de prosa aquí para explicar lo que hace este código. Ya se marcó y aparece en la cola de revisión de publicaciones de baja calidad, por lo que corre el riesgo de que se elimine. – sideshowbarker

5

finalmente acabo de encontrar la solución simple, puede obtener ayuda no

  1. global.asax en función de arranque

    protected void Application_Start() 
    { 
        log4net.Config.XmlConfigurator.Configure(); 
    } 
    
  2. En cualquiera de la clase donde el uso de registro a nivel de clase

complemento espacio de nombres

using log4net; 

agregar esta línea de código a nivel de clase

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
  1. función de registro de uso en cualquiera de la llamada acción

    log.Error("test error q111.."); 
    
  2. 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

1

Lo arreglé agregando el RepositoryAttribute al archivo AssemblyInfo.cs del ensamblaje ofensivo.

[assembly: AssemblyTrademark("")] 
[assembly: AssemblyCulture("")] 
[assembly: RepositoryAttribute("Your.Namespace.Here")] 
+0

He intentado anteriormente, y ahora log4net no está dando error para crear el repositorio para el ensamblaje, pero todavía no escribe en el archivo de registro. Después de crear el repositorio, simplemente apaga el ensamblado. ¿¿alguna idea?? – meghana

Cuestiones relacionadas