.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);

3. 本節源碼:[github](https://github.com/webmote-org/)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM