OWIN logentries System.IndexOutOfRangeException
У нас был https://www.nuget.org/packages/Microsoft.AspNet.WebApi.SelfHost/ сервис Web Api, и он отлично работает. Затем мы мигрировали на https://www.nuget.org/packages/Microsoft.AspNet.WebApi.OwinSelfHost/ и у нас возникла проблема. Мы разворачиваем службу на сервере, и через 40-60 минут мы получаем ошибку, и служба не отвечает, и мы не можем ее остановить. Затем мы убиваем процесс и запускаем сервис, и он работает нормально в течение следующих 40-60 минут. Как я понимаю, поток или очередь приложения logentries не отвечают, потому что мы видим журналы в файле, а не в logentries.
<appender name="LeAppender" type="log4net.Appender.LogentriesAppender, LogentriesLog4net">
<Debug value="true" />
<HttpPut value="false" />
<Ssl value="false" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="|%level%| %m" />
</layout>
</appender>
<root>
<priority value="ALL" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="LogFileAppender" />
<appender-ref ref="LeAppender" />
</root>
Ошибка:
XXXX-XX-XX XX-XX-XX,XXX [Logentries Log Appender] FATAL Topshelf.Runtime.Windows.WindowsServiceHost The service threw an unhandled exception System.IndexOutOfRangeException: Probable I/O race condition detected while copying memory. The I/O package is not thread safe by default. In multithreaded applications, a stream must be accessed in a thread-safe way, such as a thread-safe wrapper returned by TextReader's or TextWriter's Synchronized methods. This also applies to classes like StreamWriter and StreamReader.
at System.Buffer.InternalBlockCopy(Array src, Int32 srcOffsetBytes, Array dst, Int32 dstOffsetBytes, Int32 byteCount)
at System.IO.StreamWriter.Write(Char[] buffer, Int32 index, Int32 count)
at System.IO.TextWriter.SyncTextWriter.Write(Char[] buffer, Int32 index, Int32 count)
at Microsoft.Owin.Hosting.Tracing.DualWriter.Write(Char[] buffer, Int32 index, Int32 count)
at System.IO.TextWriter.WriteLine(String value)
at System.Diagnostics.TextWriterTraceListener.WriteLine(String message)
at System.Diagnostics.TraceInternal.WriteLine(String message)
at LogentriesCore.Net.AsyncLogger.WriteDebugMessages(String message)
at LogentriesCore.Net.AsyncLogger.Run()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Когда я включил режим отладки, я получил больше информации. Это проблема с appender или моим приложением? Как я могу получить больше информации?
log4net:ERROR [LogentriesAppender] ErrorCode: GenericFailure. Failed in DoAppend
LE: Write complete, flush
LE: Flush complete
LE: Await queue data
System.IndexOutOfRangeException: Probable I/O race condition detected while copying memory. The I/O package is not thread safe by default. In multithreaded applications, a stream must be accessed in a thread-safe way, such as a thread-safe wrapper returned by TextReader's or TextWriter's Synchronized methods. This also applies to classes like StreamWriter and StreamReader.
at System.Buffer.InternalBlockCopy(Array src, Int32 srcOffsetBytes, Array dst, Int32 dstOffsetBytes, Int32 byteCount)
at System.IO.StreamWriter.Write(Char[] buffer, Int32 index, Int32 count)
at System.IO.TextWriter.SyncTextWriter.Write(Char[] buffer, Int32 index, Int32 count)
at Microsoft.Owin.Hosting.Tracing.DualWriter.Write(Char[] buffer, Int32 index, Int32 count)
at System.IO.TextWriter.WriteLine(String value)
at System.Diagnostics.TextWriterTraceListener.WriteLine(String message)
at System.Diagnostics.TraceInternal.WriteLine(String message)
at LogentriesCore.Net.AsyncLogger.WriteDebugMessages(String message)
at LogentriesCore.Net.AsyncLogger.AddLine(String line)
at log4net.Appender.LogentriesAppender.Append(LoggingEvent loggingEvent)
at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)
2 ответа
Проблема с внутренней отладкой https://github.com/rapid7/le_dotnet/blob/1b2443a581a6f1a877bf90f472a44eaf5ffe0fa5/src/LogentriesCore/AsyncLogger.cs#L596
Когда мы изменили отладку на ложный appender работает.
Олег
Выложенная трассировка стека показывает, что ошибка возникает в AsyncLogger.WriteDebugMessages()
- источник показывает, что этот метод используется для записи внутренних сообщений отладки, поэтому настройка <Debug value="false" />
в конфиге должно прекратить это происходить.
Вы должны также поднять проблему с библиотекой с репро, чтобы ее можно было исправить.