今朝、非常に恐ろしい出来事がありました。私たちの QA チーム (幸いなことに、米国の就業日が始まる前に作業を開始しました) は、本番 Web サイトが突然ダウンしたことを報告しました。その時、私たちは何も奇妙なことをしていませんでした。障害は突然発生し、同時にすべての環境に影響を与えました。運用 Web サーバー (IIS) にアクセスすると、アプリケーション プールが停止していることに気付きました。再起動したところ、すぐにまたクラッシュしました。Windows イベント ビューアーを確認したところ、ログに次のエラーが見つかりました。
ソース: .NET ランタイム
アプリケーション: w3wp.exe
フレームワークのバージョン: v4.0.30319
説明: 未処理の例外が発生したため、プロセスが終了しました。
例外情報: System.Security.Authentication.AuthenticationException スタック: System.Net.Security.SslState.ForceAuthentication(Boolean, Byte[], System.Net.AsyncProtocolRequest) で System.Net.Security.SslState.ProcessAuthentication(System.Net. LazyAsyncResult) で System.Net.Security.SslStream.AuthenticateAsClient(System.String) で LogentriesCore.AsyncLoggerBase.Run() で System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) で System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) で System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) で System.Threading.ThreadHelper.ThreadStart()
ソース: ASP.NET 4.0.30319.0
未処理の例外が発生し、プロセスが終了しました。
アプリケーション ID: /LM/W3SVC/1/ROOT
プロセス ID: 10156
例外: System.Security.Authentication.AuthenticationException
メッセージ: 検証手順によると、リモート証明書は無効です。
スタックトレース: System.Net.Security.SslState.StartSendAuthResetSignal (ProtocolToken メッセージ、AsyncProtocolRequest asyncRequest、例外例外) で System.Net.Security.SslState.StartSendBlob (Byte[] 受信、Int32 カウント、AsyncProtocolRequest asyncRequest) で System.Net.Security .SslState.ProcessReceivedBlob(Byte[] バッファー、Int32 カウント、AsyncProtocolRequest asyncRequest) System.Net.Security.SslState.StartReceiveBlob(Byte[] バッファー、AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState.StartSendBlob(Byte[] 受信) 、Int32 カウント、AsyncProtocolRequest asyncRequest) System.Net.Security.SslState.ProcessReceivedBlob(Byte[] バッファー、Int32 カウント、AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState.StartReceiveBlob(Byte[] バッファー、AsyncProtocolRequest asyncRequest) システムで.Net.セキュリティ。SslState.StartSendBlob(Byte[] 着信、Int32 カウント、AsyncProtocolRequest asyncRequest) System.Net.Security.SslState.ProcessReceivedBlob(Byte[] バッファー、Int32 カウント、AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState.StartReceiveBlob(Byte[ ] バッファー、AsyncProtocolRequest asyncRequest) System.Net.Security.SslState.StartSendBlob(Byte[] 着信、Int32 カウント、AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState.ProcessReceivedBlob(Byte[] バッファー、Int32 カウント、AsyncProtocolRequest asyncRequest) System.Net.Security.SslState.StartReceiveBlob (Byte[] バッファー、AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState.StartSendBlob (Byte[] 受信、Int32 カウント、AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState で。 ProcessReceivedBlob(Byte[] バッファ、Int32 カウント、System.Net.Security.SslState.StartReceiveBlob(Byte[] バッファー、AsyncProtocolRequest asyncRequest) での AsyncProtocolRequest asyncRequest) System.Net.Security.SslState.StartSendBlob(Byte[] 着信、Int32 カウント、AsyncProtocolRequest asyncRequest) での System.Net.Security .SslState.ProcessReceivedBlob(Byte[] バッファー、Int32 カウント、AsyncProtocolRequest asyncRequest) System.Net.Security.SslState.StartReceiveBlob(Byte[] バッファー、AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState.StartSendBlob(Byte[] 受信) 、Int32 カウント、AsyncProtocolRequest asyncRequest) System.Net.Security.SslState.ProcessReceivedBlob(Byte[] バッファー、Int32 カウント、AsyncProtocolRequest asyncRequest) で System.Net.Security.SslState.StartReceiveBlob(Byte[] バッファー、AsyncProtocolRequest asyncRequest) システムで.Net.Security.SslState.System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst、Byte[] buffer、AsyncProtocolRequest asyncRequest) での StartSendBlob (Byte[] 受信、Int32 カウント、AsyncProtocolRequest asyncRequest) System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) でSystem.Net.Security.SslStream.AuthenticateAsClient(String targetHost) で LogentriesCore.AsyncLoggerBase.Run() で System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) で System.Threading.ExecutionContext.Run で(ExecutionContext executionContext、ContextCallback コールバック、オブジェクトの状態、ブール値の preserveSyncCtx) System.Threading.ExecutionContext.Run (ExecutionContext executionContext、ContextCallback コールバック、オブジェクトの状態) で System.Threading.ThreadHelper.ThreadStart()
このスタック トレースには、独自のコードは含まれていません。私にとって意味のある唯一のことは、Logentries についてのちょっとしたことでした。そのため、すぐにweb.config
ファイルを開き、構成内の次の行をコメントアウトしましたLog4Net
。
<appender-ref ref="LeAppender" />
LeAppender
以前に定義された場所
<appender name="LeAppender" type="log4net.Appender.LogentriesAppender, LogentriesLog4net">
<UseHttp value="false" />
<UseSsl value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger [host=%P{log4net:HostName}:appdomain=%appdomain:referenceid=%property{referenceid}] - %message%newline" />
</layout>
</appender>
Web サイトを再開したところ、すべてが再び機能し始めました。これがすべて発生し、営業時間前に解決されたことは非常に幸運です (しかし、営業時間は迫っていました!)。
これは完全に私をびっくりさせます。私の考えでは、Log4Net は完全に堅牢なフレームワークであり、損害を与える可能性はありません。Logentries の証明書の有効期限が切れた (またはそのようなもの) ように思われ、その結果、すぐに実稼働 Web サイトがクラッシュしました。
Log4Net/Logentries のセットアップに何か問題がありますか?
初期設定 (何が問題なのかはわかりません):
XmlConfigurator.Configure();
ロガー自体は でありILog
、次のように割り当てられます。
_log = LogManager.GetLogger("Logger");
ロギングは次のように行われます。
_log.Logger.Log(typeof(MyLogger), level, message, ex);
ここで厄介なことは何もありません。そして、それは1年以上うまく機能しています。さらに、前に述べたように、スタック トレースには独自のコードへの参照がないため、おそらく、私たちが書いた悪いコードによるものではありません。
何がうまくいかなかったのか、それを修正する方法、そしてこの種の停止によってシステムが二度とダウンしないようにする方法はありますか?