Azure WebJob日志正在使主机崩溃,我们能做什么?

Azure WebJob日志正在使主机崩溃,我们能做什么?,azure,azure-webjobs,Azure,Azure Webjobs,我们正在使用Azure运行多个Web作业。我们的一个WebJob功能具有以下签名: public static Task ProcessFileUploadedMessageAsync( [QueueTrigger("uploads")] FileUploadedMessage message, TextWriter logger, CancellationToken cancellationToken) 此函数用于监视一条消息队列,该消息指示文件已上载,然后触发文件数

我们正在使用Azure运行多个Web作业。我们的一个WebJob功能具有以下签名:

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(...)