У нас был серьезный страшный инцидент этим утром. Наша команда QA (которая, к счастью, начинает работать до начала рабочего дня в США) сообщила, что наш веб-сайт производства внезапно упал. В то время мы не делали ничего странного; неудача была внезапной и одновременно затронула все наши среды. Я пошел на веб-сервер производства (IIS) и обнаружил, что пул приложений остановлен. Я перезапустил его, и он сразу же разбился. Я проверил просмотра событий Windows, и обнаружил следующую ошибку в журналах:Log4Net/LogEntries сбили наш производственный сайт
Источник: .NET время выполнения
Применение: w3wp.exe
Framework Версия: v4.0.30319
Описание: Процесс был прерван из-за необработанного исключения.
Exception Информация: System.Security.Authentication.AuthenticationException Stack: в 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
Идентификатор процесса: 10156
Исключение: System.Security.Authentication.AuthenticationException
сообщение: Удаленный сертификат недействителен в соответствии с процедура проверки.
StackTrace: в System.Net.Security.SslState.StartSendAuthResetSignal (ProtocolToken сообщение, AsyncProtocolRequest AsyncRequest, исключение) Исключение в System.Net.Security.SslState.StartSendBlob (байт [] входящие, граф Int32, AsyncProtocolRequest AsyncRequest) в System.Net.Security.SslState.ProcessReceivedBlob (байт [] buffer, Int32 count, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.StartReceiveBlob (байт [] buffer, AsyncProtocolRequest asyncRequest) в System.Net.Security. SslState.StartSendBlob (Byte [] incoming, Int32 count, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.ProcessReceivedBlob (байт [] buffer, Int32 count, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.StartReceiveBlob (Байт [] buffer, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.StartSendBlob (Byte [] входящий, Int32-счет, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.ProcessReceivedBlob (байт [] buffer, Int32 рассчитывать, AsyncProtocolRequest AsyncRequest) на System.Net.Security.SslState.StartReceiveBlob (байт [] буфера, AsyncProtocolRequest AsyncRequest) на System.Net.Security.SslState.StartSendBlob (байт [] входящие, граф Int32, AsyncProtocolRequest AsyncRequest) в System.Net.Security.SslState.ProcessReceivedBlob (байт [] buffer, Int32 count, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.StartReceiveBlob (байт [] buffer, AsyncProtocolRequest asyncRequest) в System.Net.Security. SslState.StartSendBlob (байт [] входящие, Int32 рассчитывать, AsyncProtocolRequest AsyncRequest) на System.Net.Security.SslState.ProcessReceivedBlob (байт [] буфера, граф Int32, AsyncProtocolRequest AsyncRequest) на System.Net.Security.SslState.StartReceiveBlob (байт [] буфера, AsyncProtocolRequest AsyncRequest) на System.Net.Security.SslState.StartSendBlob (байт [] входящие, Int32 рассчитывать, AsyncProtocolRequest AsyncRequest) в System.Net.Security.SslState.ProcessReceivedBlob (байт [] буфера, граф Int32, AsyncProtocolRequest AsyncRequest) в системе .Net.Security.SslState.StartReceiveBlob (Byte [] buffer, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState.StartSendBlob (Byte [] incoming, Int32 count, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslState. ProcessReceivedBlob (байт [] b uffer, Int32 рассчитывать, AsyncProtocolRequest AsyncRequest) на System.Net.Security.SslState.StartReceiveBlob (байт [] буфера, AsyncProtocolRequest AsyncRequest) на System.Net.Security.SslState.StartSendBlob (байт [] входящие, граф Int32, AsyncProtocolRequest AsyncRequest) в System.Net.Security.SslState.ForceAuthentication (Boolean receiveFirst, байт [] буфера, AsyncProtocolRequest AsyncRequest) на System.Net.Security.SslState.ProcessAuthentication (LazyAsyncResult lazyResult) в System.Net.Security.SslStream.AuthenticateAsClient (String targetHost) в LogentriesCore.AsyncLoggerBase.Run() в System.Threading.ExecutionContext.RunInternal (ИсполнениеКонтекстовое исполнениеКонтекст, Обратный вызов ContextCallback, Состояние объекта, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run (ExecutionContext executeContext, ContextCallback callback, состояние объекта, Boolean preserveSyncCtx) в System.Threading.ExecutionContext.Run (ИсполнениеКонтекстовое исполнениеКонтекст, Обратный вызов 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>
Я перезагрузил веб-сайт и все началось снова работает, и наши клиенты не были более мудрыми; очень повезло, что все это произошло и разрешилось до рабочего времени (но было близко!).
Это полностью уродливает меня. Log4Net, на мой взгляд, должен быть абсолютно надежной структурой, которая не может нанести никакого ущерба. Мне кажется, что у Logentries истекали срок действия сертификата (или что-то в этом роде), и эффект от этого был немедленно разрушен на нашем производственном веб-сайте!
Что-то не так с нашей установкой Log4Net/Logentries?
Первоначальная конфигурация (не знаю, что может быть не так с этим):
XmlConfigurator.Configure();
Сам регистратор является ILog
, и ему присваивается следующим образом:
_log = LogManager.GetLogger("Logger");
и регистрация осуществляется как так:
_log.Logger.Log(typeof(MyLogger), level, message, ex);
Ничего неприятного здесь. И он работает отлично уже более года. Более того, трассировка стека, как я упоминал ранее, не имеет никакого отношения к какому-либо из нашего собственного кода, поэтому, вероятно, это не из-за плохого кода, который мы написали.
Любые идеи, что пошло не так, как это исправить, и как убедиться, что этот отключение никогда не приводит нашу систему к работе снова?
Это может произойти из-за множественного экземпляра объекта logger. Я предлагаю вам следовать шаблону singleton, чтобы избежать создания множественного экземпляра –
@Chandruvelan - если это проблема из-за нескольких экземпляров, то почему это не сработало один раз раньше прошедший год? И к тому же, почему это разрушает весь наш сайт? –