Проблема производительности NHibernate log4net - как отключить? - PullRequest
3 голосов
/ 29 сентября 2010

Я профилировал наше приложение ASP .NET, чтобы попытаться уменьшить загрузку ЦП и обнаружил странное поведение, связанное с NHibernate и log4net.

Более 50% времени в нашем приложении тратится в log4net GetLogger иМетоды CreateRepository, которые вызываются из ExecuteReader в NHibernate.На приведенном ниже снимке экрана показан анализ точки доступа jetBrains, где стрелки указывают от вызывающего метода к вызываемому методу.

alt text

На приведенном ниже снимке экрана приведен просто список самых медленных функций.Как вы можете видеть, конструктор NHybridDataReader вызывает GetLogger, и это занимает много времени.

alt text

Очевидно, что происходит что-то подозрительное, и я хочу полностью отключить log4net в NHibernate, так как мы используем другие журналыфункциональность.

В нашем файле web.config нет записей о log4net, так как мне его отключить?Файлы журналов не создаются, и, судя по именам методов, на самом деле он ничего не нашел, а просто пытается найти регистратор, в который он должен что-то записывать.

Самое запутанноеКто-нибудь может помочь?

Ответы [ 3 ]

6 голосов
/ 29 сентября 2010

Чтобы получить ответ на конкретный вопрос (отключив использование log4net с помощью NHibernate), найдите код файл Logging.cs для NHibernate.Когда я посмотрел на него (само собой разумеется, я посмотрел на альфа-код версии 3.0, но сомневаюсь, что он сильно отличается от 2.x), в статическом конструкторе LoggerProvider он делегирует GetNHibernateLoggerClass, чтобы определить используемый класс.Если он не получает один, он использует класс, не основанный на операции.Поэтому, если вы заглянете в метод GetNHibernateLoggerClass, вы увидите, что сначала он ищет ключ appsettings, называемый «nhibernate-logger», который вы должны иметь возможность установить в «NHibernate.NoLoggingLoggerFactory, NHibernate».Вы также можете заметить, что при отсутствии определенного ключа он будет автоматически использовать log4net, если обнаружит DLL log4net в пути поиска (вероятно, это просто каталог, содержащий NHibernate DLL. Поэтому вы также можете попробовать удалить саму DLL log4net и посмотреть, что произойдет.Хотя первое решение является более явным, а второе - более логичным, поэтому я бы использовал первое.

В качестве примечания, это отличный пример того, почему открытый исходный код работает так хорошо.просто посмотрите исходный код, чтобы ответить на такой вопрос. В закрытом исходном коде вам придется либо обманывать и отражать код .NET (который может быть запутан), либо молиться, чтобы владельцы тщательно документировали такие непонятные моменты, как этот.

Кстати, этот же файл исходного кода предоставляет то, что нужно, если вы хотите взять сообщения журнала NHibernate и перенаправить их в свое собственное решение для ведения журнала, как вы уже упоминали (реализовать интерфейсы ILogger и ILoggerFactory и использовать конфигурациюустановка).

5 голосов
/ 29 сентября 2010

Как я вижу, скриншот, который вы разместили, говорит о том, что на самом деле время, затрачиваемое на NHibernate для выполнения какого-либо запроса.log4net тут не при чем.Реальная проблема в том, что вы, кажется, выполняете какой-то запрос 3529 раз.

1 голос
/ 29 сентября 2010

Установите уровень ведения журнала соответствующим образом для регистратора NHibernate в файле конфигурации:

<logger name="NHibernate">
  <level value="ERROR" />
</logger>

Я полагаю, что по умолчанию это DEBUG, и он делает много записей. Я не отключил бы его полностью, так как вы хотите получать информацию о событиях ERROR или FATAL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...