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);
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());
<?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>
以上是关于EntityFramework优化:SQL语句日志的主要内容,如果未能解决你的问题,请参考以下文章
Mysql性能优化----SQL语句优化索引优化数据库结构优化系统配置优化服务器硬件优化