EntityFramework优化:SQL语句日志

Posted libingql

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EntityFramework优化:SQL语句日志相关的知识,希望对你有一定的参考价值。

技术图片
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Text;
using System.Data.Entity.Infrastructure.Interception;
using System.Diagnostics;
using System.Data.Common;

using NLog;

namespace Libing.Portal.Web.Common.Interceptors

    public class NLogDbCommandInterceptor : DbCommandInterceptor
    
        private static readonly Stopwatch watch = new Stopwatch();
        private static readonly Logger logger = LogManager.GetCurrentClassLogger();

        public override void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
        
            base.ScalarExecuting(command, interceptionContext);

            watch.Restart();
        

        public override void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
        
            watch.Stop();

            if (interceptionContext.Exception != null)
            
                logger.Error("Exception:1 \r\n --> Error executing command: 0", command.CommandText, interceptionContext.Exception.ToString());
            
            else
            
                StringBuilder message = new StringBuilder();
                message.AppendFormat("\r\n-->0", command.CommandText);
                foreach (DbParameter parameter in command.Parameters)
                
                    message.AppendFormat("\r\n-- 0: ‘1‘ (Type = 2, IsNullable = 3)", parameter.ParameterName, parameter.Value, parameter.DbType, parameter.IsNullable);
                
                message.AppendFormat("\r\n-- Completed in 0 ms", watch.ElapsedMilliseconds, command);

                logger.Trace(message.ToString());
            

            base.ScalarExecuted(command, interceptionContext);
        

        public override void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        
            base.NonQueryExecuting(command, interceptionContext);

            watch.Restart();
        

        public override void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        
            watch.Stop();

            if (interceptionContext.Exception != null)
            
                logger.Error("Exception:1 \r\n --> Error executing command: 0", command.CommandText, interceptionContext.Exception.ToString());
            
            else
            
                StringBuilder message = new StringBuilder();
                message.AppendFormat("\r\n-->0", command.CommandText);
                foreach (DbParameter parameter in command.Parameters)
                
                    message.AppendFormat("\r\n-- 0: ‘1‘ (Type = 2, IsNullable = 3)", parameter.ParameterName, parameter.Value, parameter.DbType, parameter.IsNullable);
                
                message.AppendFormat("\r\n-- Completed in 0 ms", watch.ElapsedMilliseconds, command);

                logger.Trace(message.ToString());
            

            base.NonQueryExecuted(command, interceptionContext);
        

        public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
        
            base.ReaderExecuting(command, interceptionContext);

            watch.Restart();
        

        public override void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
        
            watch.Stop();

            if (interceptionContext.Exception != null)
            
                logger.Error("Exception:1 \r\n --> Error executing command: 0", command.CommandText, interceptionContext.Exception.ToString());
            
            else
            
                StringBuilder message = new StringBuilder();
                message.AppendFormat("\r\n-->0", command.CommandText);
                foreach (DbParameter parameter in command.Parameters)
                
                    message.AppendFormat("\r\n-- 0: ‘1‘ (Type = 2, IsNullable = 3)", parameter.ParameterName, parameter.Value, parameter.DbType, parameter.IsNullable);
                
                message.AppendFormat("\r\n-- Completed in 0 ms", watch.ElapsedMilliseconds, command);

                logger.Trace(message.ToString());
            

            base.ReaderExecuted(command, interceptionContext);
        
    
NLogDbCommandInterceptor.cs
技术图片
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

using System.Data.Entity.Infrastructure.Interception;
using Libing.Portal.Web.Common.Interceptors;

namespace Libing.Portal.Web.Data

    public class PortalContext : DbContext
    
        static PortalContext()
        
            Database.SetInitializer<PortalContext>(null);

            // 日志:Entity Framework生成的Sql语句
            DbInterception.Add(new NLogDbCommandInterceptor());
        
    
PortalContext.cs
技术图片
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true">
  <targets>
    <target name="file" xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">
      <target xsi:type="File"
              fileName="$basedir/Logs/$shortdate.log"
              layout="$longdate $level:uppercase=true $event-context:item=Action $message $event-context:item=Amount $stacktrace"
              keepFileOpen="false"
              archiveFileName="$basedir/Logs/$shortdate.##.log"
              archiveAboveSize="1048576"
              encoding="UTF-8" />
    </target>
  </targets>
  <rules>
    <!--Trace->Debug->Info->Warn->Error->Fatal-->
    <logger name="*" minlevel="Trace" writeTo="file" />
  </rules>
</nlog>
NLog.config

以上是关于EntityFramework优化:SQL语句日志的主要内容,如果未能解决你的问题,请参考以下文章

EF-记录程序自动生成并执行的sql语句日志

SQL语句的几种优化方法

Mysql性能优化----SQL语句优化索引优化数据库结构优化系统配置优化服务器硬件优化

MySQL5.6 怎样优化慢查询的SQL语句 -- 慢日志介绍

Mysql优化之慢查询优化

日志系统:一条SQL更新语句是如何执行的