zoukankan      html  css  js  c++  java
  • 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} 
     --> Error executing command: {0}", command.CommandText, interceptionContext.Exception.ToString());
                }
                else
                {
                    StringBuilder message = new StringBuilder();
                    message.AppendFormat("
    -->{0}", command.CommandText);
                    foreach (DbParameter parameter in command.Parameters)
                    {
                        message.AppendFormat("
    -- {0}: '{1}' (Type = {2}, IsNullable = {3})", parameter.ParameterName, parameter.Value, parameter.DbType, parameter.IsNullable);
                    }
                    message.AppendFormat("
    -- 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} 
     --> Error executing command: {0}", command.CommandText, interceptionContext.Exception.ToString());
                }
                else
                {
                    StringBuilder message = new StringBuilder();
                    message.AppendFormat("
    -->{0}", command.CommandText);
                    foreach (DbParameter parameter in command.Parameters)
                    {
                        message.AppendFormat("
    -- {0}: '{1}' (Type = {2}, IsNullable = {3})", parameter.ParameterName, parameter.Value, parameter.DbType, parameter.IsNullable);
                    }
                    message.AppendFormat("
    -- 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} 
     --> Error executing command: {0}", command.CommandText, interceptionContext.Exception.ToString());
                }
                else
                {
                    StringBuilder message = new StringBuilder();
                    message.AppendFormat("
    -->{0}", command.CommandText);
                    foreach (DbParameter parameter in command.Parameters)
                    {
                        message.AppendFormat("
    -- {0}: '{1}' (Type = {2}, IsNullable = {3})", parameter.ParameterName, parameter.Value, parameter.DbType, parameter.IsNullable);
                    }
                    message.AppendFormat("
    -- 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
  • 相关阅读:
    Java IO流(一)
    Java File类
    LeetCode Notes_#16 3Sum Cloest
    LeetCode Notes_#15 3Sum
    LeetCode Notes_#11 Container with Most Water
    《[Wow!photoshop创意设计].李正贤.扫描版.pdf》
    计算机视觉新手指南
    对命名实体识别进行基准测试:StanfordNLP,IBM,spaCy,Dialogflow和TextSpace
    医学模型深度学习训练的挑战
    卷积神经网络(CNN)简易教程
  • 原文地址:https://www.cnblogs.com/libingql/p/11534385.html
Copyright © 2011-2022 走看看