.net core 下監控Sql的執行語句
阿新 • • 發佈:2018-11-16
最近在編寫.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/)