В существующем проекте у нас есть log4net, настроенный на использование настраиваемого приложения ADO.NET (AsglAppender) для записи ошибок в базу данных SQL Server:
public class AsglAppender : BufferingAppenderSkeleton
И раздел конфигурации log4net определен так:
<log4net>
<appender name="AsglAppender" type="Asgl.Core.Logging.AsglAppender, Asgl.Core" />
<appender name="TcpAppender" type="Asgl.Logging.TcpAppender, Asgl">
<param name="LocalPort" value="882" />
<layout type="log4net.Layout.XmlLayout" />
</appender>
<logger name="NHibernate">
<level value="OFF" />
</logger>
<root>
<level value="ERROR" />
<appender-ref ref="AsglAppender" />
</root>
<!--
<root>
<level value="ALL" />
<appender-ref ref="TcpAppender" />
</root>
-->
</log4net>
Когда logger.Error («Некоторое сообщение об ошибке»); вызывается, я получаю это исключение:
System.Data.SqlClient.SqlException (0x80131904): сбой INSERT, поскольку
следующие параметры SET имеют неправильные настройки: «ANSI_NULLS».
Убедитесь, что параметры SET верны для использования с индексированными представлениями и / или
индексы на вычисляемых столбцах и / или отфильтрованные индексы и / или запрос
уведомления и / или методы типа данных XML и / или пространственный индекс
операции.
Это существующий код, который, предположительно, раньше работал нормально.
После отладки я обнаружил, что этот переопределенный метод AsglAppender вызывается
protected override void SendBuffer(LoggingEvent[] events)
, который выполнил пользовательскую хранимую процедуру ErrorInsert , которая выполняет вставку сообщения об ошибке в таблицу. Я проверил хранимую процедуру и обнаружил, что она была создана с SET ANSI_NULLS OFF
После того, как я изменил его на SET ANSI_NULLS ON , регистрация начала работать без проблем. Не уверен, почему этот параметр влияет на ведение журнала таким образом ...