SQLのログハンドリングについて
SQLのログって自由にハンドリングしたいですよね。
Somaではこんなインタフェースを用意しました。
public interface ILogger { void LogBeforeExecution(LogContext logContext); void LogAfterExecution(LogContext logContext); }
LogBeforeExecutionはSQL実行直前に呼び出されるメソッド、LogAfterExecutionはSQL実行直後に呼び出されるメソッドです。
LogContextはこんなクラスです。
public class LogContext { // Properties public string CallerClassName { get; } public string CallerMethodName { get; } public DbCommand Command { get; } public Exception Exception { get; set; } public string FormattedSql { get; } public object LogState { get; set; } public string RawSql { get; } }
RawSqlがバインド変数つきのSQLで、FormattedSqlはバインド変数をパラメータに置き換えた値です。実際のパラメータはCommandに入っています。ILoggerの実装クラスでlog4netやNLogなど好きなライブラリを使って出力してもらうことを想定しています。CommandからDbConnectionがとれるのでDBに格納することも可能です。
LogStateは、LogBeforeExecutionからLogAfterExecutionに任意の値(SQLの実行時刻とか)を渡す場合に使えます。
実装クラスはApp.configなどで設定できます。
<!-- soma/loggerセクションの宣言: ロガーの設定をする場合に使用 --> <configSections> <sectionGroup name="soma"> <section name="logger" type="Soma.Data.Log.LoggerSection, Soma" /> </sectionGroup> </configSections> <!-- ロガーの設定: SQLのログ出力が必要な場合に使用 --> <soma> <logger type="QuickStart.MyLogger, QuickStart" /> </soma>
プログラムで設定することもできます。
SomaSettings.Logger = new MyLogger();