Azure WebJob日志正在使主机崩溃,我们能做什么?
我们正在使用Azure运行多个Web作业。我们的一个WebJob功能具有以下签名:Azure WebJob日志正在使主机崩溃,我们能做什么?,azure,azure-webjobs,Azure,Azure Webjobs,我们正在使用Azure运行多个Web作业。我们的一个WebJob功能具有以下签名: public static Task ProcessFileUploadedMessageAsync( [QueueTrigger("uploads")] FileUploadedMessage message, TextWriter logger, CancellationToken cancellationToken) 此函数用于监视一条消息队列,该消息指示文件已上载,然后触发文件数
public static Task ProcessFileUploadedMessageAsync(
[QueueTrigger("uploads")] FileUploadedMessage message,
TextWriter logger,
CancellationToken cancellationToken)
此函数用于监视一条消息队列,该消息指示文件已上载,然后触发文件数据的导入。请注意,第二个参数使用了TextWriter
:这是由WebJobs API基础结构提供的
我们的导入过程有点慢(在某些情况下,单个文件导入可能需要几个小时),因此我们会定期将消息写入日志(通过TextWriter
)以跟踪我们的进度。不幸的是,由于日志记录异常,我们的较大文件导致WebJob宿主进程终止。以下是托管进程日志中的堆栈跟踪示例:
[04/02/2016 03:44:59 > 660083: ERR ]
[04/02/2016 03:45:00 > 660083: ERR ] Unhandled Exception: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
[04/02/2016 03:45:00 > 660083: ERR ] Parameter name: chunkLength
[04/02/2016 03:45:00 > 660083: ERR ] at System.Text.StringBuilder.ToString()
[04/02/2016 03:45:00 > 660083: ERR ] at System.IO.StringWriter.ToString()
[04/02/2016 03:45:00 > 660083: ERR ] at Microsoft.Azure.WebJobs.Host.Loggers.UpdateOutputLogCommand.<UpdateOutputBlob>d__10.MoveNext()
[04/02/2016 03:45:00 > 660083: ERR ] --- End of stack trace from previous location where exception was thrown ---
[04/02/2016 03:45:00 > 660083: ERR ] at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
[04/02/2016 03:45:00 > 660083: ERR ] at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
[04/02/2016 03:45:00 > 660083: ERR ] at Microsoft.Azure.WebJobs.Host.Loggers.UpdateOutputLogCommand.<TryExecuteAsync>d__3.MoveNext()
[04/02/2016 03:45:00 > 660083: ERR ] --- End of stack trace from previous location where exception was thrown ---
[04/02/2016 03:45:00 > 660083: ERR ] at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
[04/02/2016 03:45:00 > 660083: ERR ] at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
[04/02/2016 03:45:00 > 660083: ERR ] at Microsoft.Azure.WebJobs.Host.Timers.RecurrentTaskSeriesCommand.<ExecuteAsync>d__0.MoveNext()
[04/02/2016 03:45:00 > 660083: ERR ] --- End of stack trace from previous location where exception was thrown ---
[04/02/2016 03:45:00 > 660083: ERR ] at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
[04/02/2016 03:45:00 > 660083: ERR ] at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
[04/02/2016 03:45:00 > 660083: ERR ] at Microsoft.Azure.WebJobs.Host.Timers.TaskSeriesTimer.<RunAsync>d__d.MoveNext()
[04/02/2016 03:45:00 > 660083: ERR ] --- End of stack trace from previous location where exception was thrown ---
[04/02/2016 03:45:00 > 660083: ERR ] at Microsoft.Azure.WebJobs.Host.Timers.BackgroundExceptionDispatcher.<>c__DisplayClass1.<Throw>b__0()
[04/02/2016 03:45:00 > 660083: ERR ] at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
[04/02/2016 03:45:00 > 660083: ERR ] at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
[04/02/2016 03:45:00 > 660083: ERR ] at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
[04/02/2016 03:45:00 > 660083: ERR ] at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
[04/02/2016 03:45:00 > 660083: ERR ] at System.Threading.ThreadHelper.ThreadStart()
[04/02/2016 03:45:00 > 660083: SYS ERR ] Job failed due to exit code -532462766
[04/02/2016 03:45:01 > 660083: SYS INFO] Process went down, waiting for 0 seconds
[04/02/2016 03:45:01 > 660083: SYS INFO] Status changed to PendingRestart
没有比这更复杂的了
更新:似乎这已被报告为。您应该向方法添加
async
,如下所示:
public async static Task ProcessFileUploadedMessageAsync(...)
要了解详细信息,您可以查看Steven,它是否在没有异步方法的情况下工作:
logger.WriteLine(“要记录的一些文本”)
?@Thomas我没有试过,谢谢,但是这个特殊的方法没有await
调用,只是返回一个由不同异步方法生成的任务。但是你说你使用了“await logger.WriteLineAsync(“一些要记录的文本”);”用于日志记录。这段代码不是ProcessFileUploadedMessageAsync中的吗?不,对不起,这是问题的简化。记录器实际上并没有直接在WebJob方法中使用,它只是传递给返回任务的异步方法。
await logger.WriteLineAsync("some text to log");
public async static Task ProcessFileUploadedMessageAsync(...)