2012-01-18 4 views
0

Я знаю, как настроить NHibernate и log4net для регистрации полученного SQL-запроса. Возможно ли, однако, зарегистрировать только конкретные запросы (например, активирование активности ведения журнала перед запросом LINQ и деактивация его сразу после запроса)?Журналы конкретных NHibernate SQL-запросов

ответ

2

Вы можете программно добавлять и удалять приложения к экземпляру log4net. Итак, что вы можете сделать, это когда вы нажимаете на запрос, который хотите записать, программно добавляете новый appender, запускаете запрос и затем программно удаляете appender. Я не тестировал это, но думаю, что это должно быть возможно.

Here is a reference о том, как программно добавлять дополнения.

+0

спасибо. Это, по вашему мнению, правильный способ регистрации только определенных (сложных) запросов? – StockBreak

+0

Да, я бы попытался это сделать. Вы должны иметь возможность программно включить требуемое ведение журнала, выполнить запрос и затем отключить ведение журнала. Я уверен, что что-то по этой линии будет работать; Тем не менее, я лично лично не проверял это сам. –

+0

Это приведет к тому, что запросы одновременных сеансов будут регистрироваться. Но я не думаю, что другое решение доступно, если OP хочет использовать NHibernate встроенный журнал, а не какой-то пользовательский. –

0

Вы можете зарегистрировать SQL самостоятельно с помощью перехватчика, который вы бы включили при необходимости.

public class SqlLogInterceptor : EmptyInterceptor 
{ 
    private static readonly ILog _log = 
     LogManager.GetLogger(typeof(SqlLogInterceptor)); 

    public bool Enabled { get; set; } 

    public override SqlString OnPrepareStatement(SqlString sql) 
    { 
     // Adjust your log level as you see fit. 
     if (Enabled) 
      _log.Info(sql); 
     return sql; 
    }  
} 

При открытии сеанса, обеспечивают экземпляр перехватчика в OpenSession и сохранить ссылку на него.

Установите свой Enabled объект, когда вам понадобится регистрация. Если вы используете экземпляр перехватчика только с одним сеансом, он будет регистрировать только этот сеанс SQL.

Значения параметров не будут регистрироваться с этим решением.

Смежные вопросы