web-dev-qa-db-fra.com

La configuration de Log4net à partir de l'attribut Assembly ne charge pas le fichier de configuration

J'ai le fichier suivant Log4net.config dans mon répertoire 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>

Et le code suivant dans mon fichier 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)]

Lorsque je lance le programme, je reçois la sortie de débogage log4net suivante:

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 charge, mais ne semble pas traiter mon fichier de configuration. Lorsque je commente l'attribut dans AssemblyInfo.cs et exécute le code suivant lors de l'initialisation de mon programme, il fonctionne comme prévu:

var log4netConfig = "Log4net.config";
var log4netInfo = new FileInfo(log4netConfig);
log4net.Config.XmlConfigurator.ConfigureAndWatch(log4netInfo);

Qu'est-ce que je fais mal? Je veux charger de AssemblyInfo.cs.

26
Chris

J'ai aussi des problèmes avec cette méthode de booster le log4net. La documentation indique que vous devez passer un appel très tôt dans le démarrage de votre application.

si vous utilisez des attributs de configuration, vous devez appeler log4net pour lui permettre de lire les attributs. Un simple appel à LogManager.GetLogger entraîne la lecture et le traitement des attributs de l'assembly appelant. Il est donc impératif de passer un appel d'enregistrement le plus tôt possible lors du démarrage de l'application, et certainement avant que les assemblys externes aient été chargés et invoqués.

Essayez de placer un enregistreur dans la même classe que celle qui démarre votre application (program.cs, app.xaml, peu importe). Par exemple

private static readonly ILog Log = LogManager.GetLogger(typeof(Program));

Et pour les coups de pied, appelez le journal (même s'il est filtré ou évalué en dehors du processus d'ajout, il devrait obliger log4net à évaluer votre référentiel/hiérarchie).

static Program()
{
    Log.Debug("Application loaded.");
}
35
Anthony Mastrean

enfin je viens de trouver la solution simple, vous pouvez obtenir de l'aide là-bas

  1. Global.asax dans la fonction de démarrage 

     protected void Application_Start()
     {
       log4net.Config.XmlConfigurator.Configure();
     }
    
  2. Dans n'importe quelle classe où utiliser la journalisation au niveau de la classe

ajouter un espace de noms

using log4net;

ajouter cette ligne de code au niveau de la classe

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
  1. utiliser la fonction log dans n'importe lequel des appels d'action

    log.Error("test error q111..");
    
  2. configuration

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

cela peut aider tout le monde et est facile à utiliser. Merci

6
adnan

Je garde log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config"))); dans le fichier Global.asax.cs à l'intérieur de Application_Start () ... Je n'ai donc pas besoin de transporter la commande partout. 

4
rkmorgan

J'ai résolu ce problème en ajoutant RepositoryAttribute au fichier AssemblyInfo.cs de l'Assemblée en cause.

[Assembly: AssemblyTrademark("")]
[Assembly: AssemblyCulture("")]
[Assembly: RepositoryAttribute("Your.Namespace.Here")]
1
NightShovel

J'utilise des sections Web.Config pour configurer le consignateur et consigner manuellement les événements, Bootstrapping Logger de global.asax

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

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

Essayez de le démarrer à partir de global.asax

0
Rahul Jujarey