2017-06-06 29 views
0

私は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つの信号を見つけるためにメガバイトのノイズを乗り越える必要はありません。

だから、私の質問:

  1. は、それがオンになってLog4netデバッグをせずに、トレースリスナーでAppenderに致命的なエラーをキャプチャすることは可能ですか?
  2. この動作は仕様ですか?

答えて

1

解決策が見つかりました。素晴らしい、エレガントなもの。

Log4netのすべてのアペンダークラスには、ErrorHandlerというパブリックプロパティがあります。デフォルトでは、これはOnlyOnceErrorHandlerという名前のクラスのインスタンスに設定されています。これは、デバッグフィード(使用可能な場合)にエラーを記録し、エラー報告を停止します。

<log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="Logs\logfile.txt" /> 
     <rollingStyle value="Date" /> 
     <datePattern value="yyyyMMdd" /> 
     <maxSizeRollBackups value="-1" /> 
     <maximumFileSize value="50GB" /> 
     <errorHandler type="MyTraceLoggingErrorHandler, MyAssembly" /> 

ErrorHandlerは非常にシンプルなインターフェイスIErrorHandlerを実装し、あなたはそれがやりたいものは何でも行うことができます。

しかし、あなたは構成によって、これをオーバーライドすることができます。

私の場合、私は単にそれがTraceListenerに受信したメッセージと例外を書きましたが:

Trace.WriteLine(message); 
Trace.WriteLine(errorCode); 
Trace.WriteLine(e.Message); 
Trace.WriteLine(e.StackTrace); 

そして、私の問題を解決しました。

関連する問題