예제 #1
0
        private void Log <TResult>(DbCommand command, DbCommandInterceptionContext <TResult> interceptionContext)
        {
            DateTime startTime;
            TimeSpan duration;

            _mStartTime.TryRemove(command, out startTime);
            if (startTime != default(DateTime))
            {
                duration = DateTime.Now - startTime;
            }
            else
            {
                duration = TimeSpan.Zero;
            }
            //int requestId = -1;

            StringBuilder sb = new StringBuilder();

            sb.AppendLine("command used:");
            sb.AppendLine(command.CommandText.Replace(Environment.NewLine, ""));

            StringBuilder parameters = new StringBuilder();

            foreach (DbParameter param in command.Parameters)
            {
                parameters.AppendLine($"{param.ParameterName} {param.DbType} = {param.Value}");
                sb.AppendLine($"set {param.ParameterName} = {param.Value} {param.DbType}");
            }
            _logger.Debug(sb.ToString());

            if (duration.TotalSeconds > 1 || interceptionContext.Exception != null)
            {
                using (var db = new EfDbContext())
                {
                    var model = new SQLProfiler()
                    {
                        Query          = command.CommandText,
                        Parameters     = parameters.ToString(),
                        CommandType    = Convert.ToString(command.CommandType),
                        TotalSeconds   = (decimal)duration.TotalSeconds,
                        Exception      = Convert.ToString(interceptionContext.Exception),
                        InnerException = interceptionContext.Exception == null ? "" : Convert.ToString(interceptionContext.Exception.InnerException),
                        RequestId      = 0,
                        FileName       = "",
                        CreateDate     = DateTime.Now,
                        Active         = true
                    };

                    if (db.SQLProfilers.Any(x => x.Query == model.Query && x.Parameters == model.Parameters))
                    {
                        return;
                    }

                    db.SQLProfilers.Add(model);
                    db.SaveChanges();
                }
            }
        }
예제 #2
0
        private void Executed <TResult>(DbCommand command, DbCommandInterceptionContext <TResult> interceptionContext)
        {
            var timer = interceptionContext.FindUserState("timer") as Stopwatch;

            timer?.Stop();

            StringBuilder sb = new StringBuilder();

            sb.AppendLine("command used:");
            sb.AppendLine(command.CommandText.Replace(Environment.NewLine, ""));

            StringBuilder parameters = new StringBuilder();

            foreach (DbParameter param in command.Parameters)
            {
                parameters.AppendLine($"{param.ParameterName} {param.DbType} = {param.Value}");
                sb.AppendLine($"set {param.ParameterName} = {param.Value} {param.DbType}");
            }
            _logger.Debug(sb.ToString());

            if (timer?.ElapsedMilliseconds > 1000 || interceptionContext.Exception != null)
            {
                using (var db = new EfDbContext())
                {
                    var model = new SQLProfiler()
                    {
                        Query          = command.CommandText,
                        Parameters     = parameters.ToString(),
                        CommandType    = Convert.ToString(command.CommandType),
                        TotalSeconds   = (decimal)timer?.ElapsedMilliseconds,
                        Exception      = Convert.ToString(interceptionContext.Exception),
                        InnerException = interceptionContext.Exception == null ? "" : Convert.ToString(interceptionContext.Exception.InnerException),
                        RequestId      = 0,
                        FileName       = "",
                        CreateDate     = DateTime.Now,
                        Active         = true
                    };

                    if (db.SQLProfilers.Any(x => x.Query == model.Query && x.Parameters == model.Parameters))
                    {
                        return;
                    }

                    db.SQLProfilers.Add(model);
                    db.SaveChanges();
                }
            }
        }