私はLog4net
を使用しています。私は最近、Log4net
によって生成されたエラーをキャプチャするために、トレースリスナーをファイルに追加して設定に反映させることにしました。 ( Log4net FAQは、このための例の構成を含む。)Log4netデバッグがオフのときLog4net Appenderエラーをキャプチャする方法
(Log4net
は、独自のエラーメッセージを生成するとき、私は、その仕事をすることができないことに、例について話している。私はそれを構成する話ではありませんそれらはトレースリスナの設定によって正しく処理された検証するために、Log4net
またはADO.Net Appender
エラーを強制するようにアプリケーションエラーをログに記録する。)
これをテストしている間、私はテストプロジェクトにおける私のLog4net
構成で周り台無し。
私が見つけたのは、Log4net
デバッグがオフになっていても、組み込みのLog4net
エラーがトレースリスナーに書き込まれることを示しています。 これは私が欲しいものです。
存在しないタイプを指すために、のLog4net.Layout
のタイプ名を調整して生成したエラーの例を示します。app.config
これはTrace Listenerファイルの唯一のエントリで、私が望んだものです。
log4net:ERROR Failed to find type [log4net.Layout.RawTimeStampLayoutXX]
System.TypeLoadException: Could not load type [log4net.Layout.RawTimeStampLayoutXX]. Tried assembly [log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a] and all loaded assemblies
at log4net.Util.SystemInfo.GetTypeFromString(Assembly relativeAssembly, String typeName, Boolean throwOnError, Boolean ignoreCase)
at log4net.Util.SystemInfo.GetTypeFromString(String typeName, Boolean throwOnError, Boolean ignoreCase)
at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.CreateObjectFromXml(XmlElement element, Type defaultTargetType, Type typeConstraint)
log4net:ERROR Failed to create object to set param: layout
はしかし、私はまた、エラーが外部システムにある場合(例えば、として以下の例では、SQL Serverのエラーで)、エラーだけLog4net
デバッグ、トレースリスナーのファイルに表示されますことを発見しましたがオンになります。つまり、内部のハウスキーピング情報の大部分に囲まれています。
log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Exception while writing to database
System.Data.SqlClient.SqlException (0x80131904): Must declare the scalar variable "@log_date".
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran, LoggingEvent[] events)
at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events)
ClientConnectionId:8ddb2758-4adc-495e-af8b-c16e0acc937a
Error Number:137,State:2,Class:15
私はこの種のエラーをキャッチするために、常にデバッグをオンにして実行したくありません。このアプリケーションは、1日に70回のようなものを実行し、内部ハウスキーピングだけから、実行ごとに25KBのデバッグトレースリスナ出力を生成します。私は1つの信号を見つけるためにメガバイトのノイズを乗り越える必要はありません。
だから、私の質問:
- は、それがオンになって
Log4net
デバッグをせずに、トレースリスナーでAppender
に致命的なエラーをキャプチャすることは可能ですか? - この動作は仕様ですか?