備考:Npgsql 3.2.0と3.2.1は、Microsoft.Extensions.Loggingを使用するために、大幅に変更しました。いくつかの苦情や問題の後(#1504を参照)、この機能は、元に戻されました。Npgsql 3.2.2から、ロギング・サポートは、Npgsql 3.1と同じになりました。
Npgsqlには、問題のデバッグに役立つ、ログの記録イベントを出力するための組み込みの機能が含まれています。
Npgsqlのログ記録は、デフォルトで無効になっており、オンにする必要があります。ログの記録は、NpgsqlLogManager.ProviderをINpgsqlLoggingProviderインターフェイスを実装しているクラスに設定することで、オンにすることができます。Npgsqlには、次のように設定できる、コンソール実装が、付属しています。:
NpgsqlLogManager.Provider = new ???
備考:他のNpgsqlメソッドを呼び出す前に、あなたは、あなたのプログラムの最初に、ログの記録プロバイダを設定する必要があります。
あなたが使用する、どんなログの記録フレームワークでも、ログ・メッセージを渡すロギング・プロバイダを作成するのは、簡単です。あなたは、ここで、このようなNLogのためのアダプタを、見つけることができます。
備考:ロギングAPIは、最初の実装です。そして、おそらく、改善/変更されます。-それをNpgsql APIの安定した部分として扱わないでください。足りないメッセージや機能があると思われる場合は、私たちに、知らせてください!
ConsoleLoggingProvider
Npgsqlには、1つの組み込みのロギング・プロバイダが、付属しています。:ConsoleLoggingProvider。それは、単に与えられたレベル以上のすべてのログ・メッセージを標準出力にダンプします。あなたは、アプリケーションの最初に、次の行を含めることで設定できます。:
NpgsqlLogManager.Provider = new ConsoleLoggingProvider(<min level>, <print level?>, <print connector id?>);
デフォルトを(警告とエラーのみを印刷する)NpgsqlLogLevel.Infoと同じレベルにします。あなたは、ログ・レベルとコネクタIDも記録しておくことができます。
ステートメントとパラメータのロギング
Statement and Parameter Logging
Npgsqlは、Debugレベルで、すべてのSQLステートメントをログに記録します。これは、PostgreSQLに送信されている内容を、正確にデバッグするのに役立ちます。
既定では、Npgsqlは、機密情報が含まれている可能性があるため、パラメータ値を記録しません。NpgsqlLogManager.IsParameterLoggingEnabledをtrueに設定することによって、あなたは、パラメータ・ロギングをオンにすることができます。
NLogLoggingProvider(または独自の実装)
NLogLoggingProvider (or implementing your own)
次のプロバイダは、NLogにログ・メッセージを渡すために、Npgsqlの単体テストで使用されます。あなたのプロジェクトに、あるいは、独自のカスタム・プロバイダを実装するための開始位置として、それを使用するため、コピー&ペーストしてください。
class NLogLoggingProvider : INpgsqlLoggingProvider
{
public NpgsqlLogger CreateLogger(string name)
{
return new NLogLogger(name);
}
}
class NLogLogger : NpgsqlLogger
{
readonly Logger _log;
internal NLogLogger(string name)
{
_log = LogManager.GetLogger(name);
}
public override bool IsEnabled(NpgsqlLogLevel level)
{
return _log.IsEnabled(ToNLogLogLevel(level));
}
public override void Log(NpgsqlLogLevel level, int connectorId, string msg, Exception exception = null)
{
var ev = new LogEventInfo(ToNLogLogLevel(level), "", msg);
if (exception != null)
ev.Exception = exception;
if (connectorId != 0)
ev.Properties["ConnectorId"] = connectorId;
_log.Log(ev);
}
static LogLevel ToNLogLogLevel(NpgsqlLogLevel level)
{
switch (level)
{
case NpgsqlLogLevel.Trace:
return LogLevel.Trace;
case NpgsqlLogLevel.Debug:
return LogLevel.Debug;
case NpgsqlLogLevel.Info:
return LogLevel.Info;
case NpgsqlLogLevel.Warn:
return LogLevel.Warn;
case NpgsqlLogLevel.Error:
return LogLevel.Error;
case NpgsqlLogLevel.Fatal:
return LogLevel.Fatal;
default:
throw new ArgumentOutOfRangeException("level");
}
}
}