最近在編寫.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/)