2016-04-04 20 views
2

Birkaç WebJobs çalıştırmak için Azure kullanıyoruz.Azure WebJob günlüğü ana bilgisayar çöküyor, ne yapabiliriz?

public static Task ProcessFileUploadedMessageAsync(
    [QueueTrigger("uploads")] FileUploadedMessage message, 
    TextWriter logger, 
    CancellationToken cancellationToken) 

Bu fonksiyon bir dosya belirten bir mesaj için bir kuyruk izlemektedir yüklendi, ardından dosyanın bir veri alma tetikler: Bizim WebJob işlevlerden biri şu imzası vardır. İkinci bağımsız değişken olarak bir TextWriter kullanıldığını unutmayın: Bu WebJobs API altyapısı tarafından sağlanır.

İçe aktarma sürecimiz yavaştır (bazı durumlarda tek bir dosya alımı için birkaç saat olabilir), bu nedenle ilerlemeyi izlemek için günlükleri (TextWriter aracılığıyla) günlük olarak yazıyoruz. Ne yazık ki, daha büyük dosyalarımız, WebJob barındırma işleminin günlüğe kaydedilen bir özel durum nedeniyle sonlandırılmasına neden oluyor. İşte barındıran işlem kaydından bir örnek Yığın izleme:

[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 

asıl sorun bu istisna bizim kod tarafından ancak WebJobs API şey tarafından değil atılmış olmasıdır: Denedik

at Microsoft.Azure.WebJobs.Host.Loggers.UpdateOutputLogCommand.<UpdateOutputBlob>d__10.MoveNext() 
numaralarını arayarak TextWriter numaralarına yaptığımız çağrıların etrafına bloklar ekledik ancak bunların hiçbir etkisi olmadı. Günlük mesajlarının bir yerde tamponlandığı ve ayrı bir iş parçacığıyla Azure blob depolama alanına düzenli olarak akıtıldığı görülür. Eğer durum buysa, istisnayı yakalamanın hiçbir yolu yoktur.

Aynı sorunla karşılaşan başka biri var mı, yoksa olası bir çözümü veya çözümü düşünen biri var mı? Biz günlük için TextWriter nasıl kullandıklarını


Tamamlayıcı olmak üzere buradadır:

await logger.WriteLineAsync("some text to log"); 

Hiçbir şey daha karmaşık.


GÜNCELLEME: Bu issue #675 on the WebJobs SDK GitHub olarak bildirilmiştir sanki görünüyor.

+0

Steven görebilirsiniz, bu zaman uyumsuz yönteminin olmadan çalışıyor oturum açmak için metin ");'? – Thomas

+0

@Thomas Bu denemedim –

cevap

0

Sadece bu gibi yöntemine async eklemek gerekir: Bazı "(` logger.WriteLine:

public async static Task ProcessFileUploadedMessageAsync(...) 

bilgi almak için, this article

+0

Teşekkürler, ancak bu özel yöntem içinde 'bekle' çağrıları yoktur ve yalnızca farklı bir async yöntemi tarafından oluşturulan bir Görev döndürür. –

+0

fakat 'logger.WriteLineAsync' yi ("giriş yapmak için bazı metinler") beklediğinizi söylediniz; kayıt için ProcessFileUploadedMessageAsync'de bu kod değil mi? –

+0

Hayır, pardon, bu soru için bir sadeleştirmekti. Logger gerçekte WebJob yönteminde doğrudan kullanılmaz, yalnızca bir Görev döndüren async yöntemine geçer. –

İlgili konular