Логирование entity framework запросов

В прошлых заметках я описывал как поднять elmah и nlog логирования. Сейчас опишу как прикрутить это к entity framework.

  1. Реализуем интерфейс IDbCommandInterceptor:
    using WebApp.Mvc.Infrastructure;
    using NLog;
    using System;
    using System.Collections.Generic;
    using System.Data.Common;
    using System.Data.Entity.Infrastructure.Interception;
    using System.Linq;
    using System.Web;
    
    namespace WebApp.Infrastructure
    {
     public class NLogCommandInterceptor : IDbCommandInterceptor
     {
     private Logger _logger = LogManager.GetCurrentClassLogger();
     private ElmahWrap _elmah = new ElmahWrap();
     public void NonQueryExecuting(
     DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
     {
     LogIfNonAsync(command, interceptionContext);
     }
    
    public void NonQueryExecuted(
     DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
     {
     LogIfError(command, interceptionContext);
     }
    
    public void ReaderExecuting(
     DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
     {
     LogIfNonAsync(command, interceptionContext);
     }
    
    public void ReaderExecuted(
     DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
     {
     LogIfError(command, interceptionContext);
     }
    
    public void ScalarExecuting(
     DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
     {
     LogIfNonAsync(command, interceptionContext);
     }
    
    public void ScalarExecuted(
     DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
     {
     LogIfError(command, interceptionContext);
     }
    
    private void LogIfNonAsync<TResult>(
     DbCommand command, DbCommandInterceptionContext<TResult> interceptionContext)
     {
     if (!interceptionContext.IsAsync)
     {
     _logger.Warn("Non-async command used: {0}", command.CommandText, interceptionContext.Exception);
     }
     }
    
    private void LogIfError<TResult>(
     DbCommand command, DbCommandInterceptionContext<TResult> interceptionContext)
     {
     if (interceptionContext.Exception != null)
     {
     _logger.Error("Command {0} failed with exception {1}", command.CommandText, interceptionContext.Exception);
     //
     _elmah.Error(string.Format("Command {0} failed with exception {1}", command.CommandText, ""),
     interceptionContext.Exception);
     }
     }
     }
    }
    
  2. Добавим строчку в конструктор класса WebApp.Migrations.Configuration
    DbInterception.Add(new NLogCommandInterceptor());
    

Ссылки:

По теме:
Список перечислений в entity framework

Entity Framework может хранить  перечисления в бд как int. А список перечислений ef уже не умеет хранить, но позволяет создавать сложные Read more

Настраиваем контекст бд и migration (entity framework)

Создадим контекст базы данных. Настроим логирование всех sql запросов в debug вывод. Настроим migration для обновления бд. Создадим класс — Read more

Делаем водяной знак на картинке (c#, .net)

Нанесем несколько раз картинку watermark на другую картинку. public void DrawWatermark(string watermarkImagePath, System.Drawing.Image image) { using (System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(watermarkImagePath)) Read more

Устанавливаем и настраиваем Ninject

Ninject это IoC контейнер для .NET платформы. Установим его и настроим. Установим ninject с помощью менеджера nuget Создадим класс который создает Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *