2010-01-20 3 views
2

Je n'arrive pas à obtenir de journalisation de NHibernate ou de mon application. J'ai essayé TOUT ce que je pouvais penser, mais rien ne fonctionne!Impossible d'obtenir NHibernate et Log4Net pour générer la journalisation.

Voici mon code:

using System.Reflection; 
using NHibernate.Cfg; 

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)] 
namespace NHibernate_Log4Net 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var cfg = new Configuration() 
        .Configure() 
        .AddAssembly(Assembly.GetCallingAssembly()); 
     } 
    } 
} 



namespace NHibernate_Log4Net.Model 
{ 
    public class Item 
    { 
     public int Id { get; set; } 
     public int Title { get; set; } 
     public int Alias { get; set; } 
    } 
} 

fichier Item.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernate_Log4Net.Model.Item" assembly="NHibernate_Log4Net" auto-import="false"> 
    <class name="User" table="Users"> 
    <id name="Id"> 
     <generator class="Native"/> 
    </id> 

    <property name="Title" length="255" not-null="true" /> 
    <property name="Alias" length="255" not-null="true" /> 
    </class> 
</hibernate-mapping> 

fichier Log4Net.config:

<?xml version="1.0" encoding="utf-8"?> 
<log4net debug="false"> 

    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="log4netLogger.log" /> 
    <appendToFile value="false" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="1000KB" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d [%t] %-5p %c - %m%n" /> 
    </layout> 
    </appender> 

    <appender name="OutputDebugStringAppender" type="log4net.Appender.OutputDebugStringAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%-5p %m - %c -%n" /> 
    </layout> 
    </appender> 
    <appender name="TraceAppender" type="log4net.Appender.TraceAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d [%t] %-5p %c - %m%n" /> 
    </layout> 
    </appender> 

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date - %message%newline"/> 
    </layout> 
    </appender> 

    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="RollingFileAppender" /> 
    <appender-ref ref="OutputDebugStringAppender" /> 
    <appender-ref ref="TraceAppender" /> 
    </root> 
    <logger name="NHibernate" additivity="false"> 
    <level value="FATAL"/> 
    <appender-ref ref="RollingFileAppender" /> 
    <appender-ref ref="OutputDebugStringAppender" /> 
    <appender-ref ref="ConsoleAppender" /> 
    <appender-ref ref="TraceAppender" /> 
    </logger> 
    <logger name="NHibernate.SQL" additivity="false"> 
    <level value="DEBUG" /> 
    <appender-ref ref="ConsoleAppender" /> 
    <appender-ref ref="RollingFileAppender" /> 
    </logger> 
    <!-- 
     NHibernate.Loader.Loader logs diagnostic stuff and SELECTs. 
     You can use either logger, or both, depending on you needs. 
    --> 
    <logger name="NHibernate.Loader.Loader" additivity="false"> 
    <level value="INFO" /> 
    <appender-ref ref="ConsoleAppender" /> 
    <appender-ref ref="RollingFileAppender" /> 
    </logger> 


</log4net> 

NHibernate renvoie une erreur que la classe Users n'existe pas. C'est prévu, mais pourquoi ne vois-je pas de journalisation de cela, de NHibernate?

(Je peux l'enregistrer moi-même, mais le point que je ne peux pas voir aucun journal de NHibernate).

+0

J'ai mis à jour ma réponse. –

Répondre

0

Le fichier de configuration doit correspondre à l'exécutable, votre exécutable s'appelle-t-il Log4Net.exe?

+0

Mon nom d'exécutable est NHibernate_Log4Net.exe mais le fichier Log4Net.config n'est pas l'application.config, mais il est utilisé dans [assembly: log4net.Config.XmlConfigurator (ConfigFile = "Log4Net.config", Watch = true)]. –

+0

Je ne pense pas que quelqu'un va le charger pour vous. Essayez de le nommer NHibernate_Log4Net.exe.config à la place. –

+0

J'ai essayé, ça ne fait rien. et comme je l'ai dit plus haut, je ne pense pas que ce soit nécessaire. –

0

J'ai rencontré des problèmes lors de l'utilisation de l'attribut XmlConfigurator dans le passé. Peut-être que vous devriez simplement appeler explicitement XmlConfigurator dans votre principale comme ceci:

namespace NHibernate_Log4Net 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      XmlConfigurator.ConfigureAndWatch(new FileInfo("log4net.config")); 
      var cfg = new Configuration() 
        .Configure() 
        .AddAssembly(Assembly.GetCallingAssembly()); 
     } 
    } 
} 
+0

J'ai essayé ceci avant et rien ne semble fonctionner ... –

0

https://web.archive.org/web/20110514164829/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/07/01/how-to-configure-log4net-for-use-with-nhibernate.aspx

J'ai utilisé le lien ci-dessus pour configurer la journalisation. Effectuez les opérations suivantes

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)] 
namespace NHibernate_Log4Net 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      log4net.Config.XmlConfigurator.Configure(); 
      var cfg = new Configuration() 
        .AddAssembly(Assembly.GetCallingAssembly()); 
        .Configure() 

     } 
    } 
} 

Le supplément est cette ligne

log4net.Config.XmlConfigurator.Configure(); 

Il ne marchait pas pour moi jusqu'à ce que j'ajouté que. Je sais que c'est un peu similaire à ce que Jeffery a suggéré, mais ... juste mes 2cents.

De même, l'appel Configure() sur l'objet de configuration Nhibernate ne devrait-il pas venir en dernier? Après l'Assemblée est ajoutée?

+0

Je peux obtenir la notation de log4net, mais je ne vois aucun journal de NHibernate. d'après ce que je sais, la configuration vient en premier, et cela signifie que nous devons d'abord configurer en fonction du fichier de configuration XML, puis nous recherchons les fichiers hbm. –

0

Si les niveaux de journalisation définis pour les journaux NHibernate sont trop élevés (ou inactifs), vous ne verrez peut-être aucun message de journal de NHibernate. Par exemple, quelle est la valeur de ((log4net.Repository.Hierarchy.Logger)LogManager.GetLogger("NHibernate").Logger).Level?

Vous devriez avoir une section dans votre fichier de configuration comme ceci:

<log4net> 
     <appender name="NHLog" type="log4net.Appender.FileAppender"> 
       <file value="logs/nhibernate.log" /> 
       <appendToFile value="false" /> 
       <layout type="log4net.Layout.PatternLayout"> 
         <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n" /> 
       </layout> 
     </appender> 
     <logger name="NHibernate" additivity="false"> 
       <level value="DEBUG"/> 
       <appender-ref ref="NHLog"/> 
     </logger> 
</log4net> 

Mise à jour: Si le fichier journal est toujours créé (en cas de non-existant avant une course), mais est toujours vide, ce point à une exception lors de l'ajout. Pour minimiser la possibilité d'une exception, ayez un conversionPattern très simple (peut-être juste "%m%n") et voyez si n'importe quelle sortie est générée. Si c'est le cas, ajoutez les éléments du modèle de conversion jusqu'à ce que vous trouviez où le problème est. Si aucune sortie n'est générée, connectez quelque chose à l'enregistreur NHibernate à partir de votre propre code (ceci est parfaitement OK) et passez-le dans le débogueur.

ILog log = LogManager.GetLogger("NHibernate"); 

log.Info("Application starting"); 

Si ce n'est toujours pas le cas, vous devrez peut-être poster une partie de votre code/configuration.

+0

J'ai, et le logs/nhibernate.log est toujours généré mais reste vide. –