1. 程式人生 > >.net core 下監控Sql的執行語句

.net core 下監控Sql的執行語句

最近在編寫.net core程式,因為資料庫從Sql Server 切換到 MySql的原因,無法直接檢視sql的具體語句,隨著業務量的劇增,痛苦也與日俱增,為了徹底解決該問題,我在github、stackoverflow等站點不斷搜尋,試圖找到一個好的辦法。

搜尋的結果大都是這樣的:

 SHOW VARIABLES LIKE "general_log%";
 SET GLOBAL general_log = 'ON';

好嘞,試過以後發現果然靈驗,BUT,我沒有許可權操作mysql的計算機,my god,此路不通~~~~

最近搜尋時再次發現MiniProfiler庫有更新~~

dotnet core支援不錯,終於看到希望了~~~

那就開始整合吧,如果你是asp.net core工程,就參考文件吧,

如果是控制檯程式,那就按照步驟開始吧:

step 1:安裝nuget包 MiniProfiler.EntityFrameworkCore ,目前仍是alpha版本。

【step 2】: 開啟EF core的監控初始化 ,如果你使用EF Core的話

 var initializer = new DiagnosticInitializer(new[] { new RelationalDiagnosticListener() });
 initializer.Start();
            

【step 2】:開啟Dapper的連結監控初始化,如果你使用Dapper的話

 

  

private DbConnection GetConnection()
{
     DbConnection conn = new MySqlConnection(MySqlDBContextOptionBuilder.GetDbConnectionString(DbInfo));
     if (MiniProfiler.Current != null)
     {
       conn = new StackExchange.Profiling.Data.ProfiledDbConnection(conn, MiniProfiler.Current);
     }
      conn.Open();
      return conn;
}

step 3:啟動監控,在你的執行程式碼上增加如下程式碼

var profiler = MiniProfiler.StartNew(m);
using (profiler.Step("SqlProfile"))
{
   // 你的程式碼
}
// 輸出日誌
if (profiler?.Root != null)
{
  var p = profiler.Root;
  Trace.WriteLine($"{p.Name}:{p.Id},{p.DurationMilliseconds} ms");
  if (p.HasChildren)
  {
    p.Children.ForEach(x =>
    {
      Trace.WriteLine($"{p.Name}:{x.Name},st:{x.StartMilliseconds} ms,exec:{x.DurationMilliseconds} ms");
      if (x.CustomTimings?.Count > 0)
      {
        foreach (var ct in x.CustomTimings)
        {
          Trace.WriteLine($"{p.Name}:Start {ct.Key} ---  ");
          ct.Value?.ForEach(y =>
          {
            Trace.WriteLine($"{p.Name}:{y.CommandString}");
            Trace.WriteLine($"{p.Name}:Execute time :{y.DurationMilliseconds} ms,Start offset :{y.StartMilliseconds} ms,Errored :{y.Errored}");
          });
          Trace.WriteLine($"{p.Name}:End {ct.Key} ---  ");
        }
      }
    });
  }
}


profiler?.StopAsync(true).ConfigureAwait(false);
var profiler = MiniProfiler.StartNew(m);
using (profiler.Step("SqlProfile"))
{
   // 你的程式碼
}
// 輸出日誌
if (profiler?.Root != null)
{
  var p = profiler.Root;
  Trace.WriteLine($"{p.Name}:{p.Id},{p.DurationMilliseconds} ms");
  if (p.HasChildren)
  {
    p.Children.ForEach(x =>
    {
      Trace.WriteLine($"{p.Name}:{x.Name},st:{x.StartMilliseconds} ms,exec:{x.DurationMilliseconds} ms");
      if (x.CustomTimings?.Count > 0)
      {
        foreach (var ct in x.CustomTimings)
        {
          Trace.WriteLine($"{p.Name}:Start {ct.Key} ---  ");
          ct.Value?.ForEach(y =>
          {
            Trace.WriteLine($"{p.Name}:{y.CommandString}");
            Trace.WriteLine($"{p.Name}:Execute time :{y.DurationMilliseconds} ms,Start offset :{y.StartMilliseconds} ms,Errored :{y.Errored}");
          });
          Trace.WriteLine($"{p.Name}:End {ct.Key} ---  ");
        }
      }
    });
  }
}


profiler?.StopAsync(true).ConfigureAwait(false);

### 引用連結
1. [口袋程式碼倉庫](http://codeex.cn)
2. [線上計算器](http://jisuanqi.codeex.cn)
3. 本節原始碼:[github](https://github.com/webmote-org/)