Не удается получить NHibernate и Log4Net для создания журнала. - PullRequest
2 голосов
/ 20 января 2010

Я не могу войти ни в NHibernate, ни в мое приложение. Я пробовал ВСЕ, что мог придумать, но ничего не получается!

Вот мой код:

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

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>

Файл 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 выдает ошибку, что класс Users не существует. Это ожидаемо, но почему я не вижу никаких записей об этом из NHibernate?

(я могу войти в него сам, но суть в том, что я не вижу ни одного журнала из NHibernate).

Ответы [ 4 ]

0 голосов
/ 22 января 2010

Если уровни ведения журнала, установленные для регистраторов NHibernate, слишком высоки (или выключены), вы можете не увидеть никаких сообщений журнала от NHibernate.Например, каково значение ((log4net.Repository.Hierarchy.Logger)LogManager.GetLogger("NHibernate").Logger).Level?

В вашем конфигурационном файле должен быть раздел, подобный следующему:

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

Обновление: Если журналФайл всегда создается (если он не существует до запуска), но всегда пуст, это указывает на исключение во время добавления.Чтобы минимизировать возможность исключения, сделайте очень простой conversionPattern (возможно, просто "%m%n") и посмотрите, генерируется ли какой-либо вывод.Если есть, добавьте обратно элементы шаблона преобразования, пока не найдете, в чем проблема.Если выходные данные не генерируются, зарегистрируйте что-либо в регистраторе NHibernate из своего собственного кода (это нормально) и перейдите к нему в отладчике.

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

log.Info("Application starting");

Если все еще нет радости, возможно, вам придется опубликовать некоторыевашего кода / конфигурации.

0 голосов
/ 20 января 2010

У меня были проблемы с использованием атрибута XmlConfigurator в прошлом. Возможно, вам следует просто явно вызвать XmlConfigurator в вашем основном файле так:

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 голосов
/ 21 января 2010

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

Я использовал вышеуказанную ссылку для настройки ведения журнала. Попробуйте следующее

[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()

        }
    }
}

Дополнительная строка

log4net.Config.XmlConfigurator.Configure();

Это не сработало для меня, пока я не добавил это. Я знаю, что это похоже на то, что предложил Джеффри, но ... только мои 2цента.

Кроме того, должен ли вызов Configure () объекта конфигурации Nhibernate быть последним? После сборки добавляется?

0 голосов
/ 20 января 2010

Файл конфигурации должен соответствовать исполняемому файлу. Ваш исполняемый файл называется Log4Net.exe?

...