using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.Azure.Management.AppService.Fluent; using Microsoft.Azure.Management.Fluent; namespace Tango.AzureUtils.Logging { public class LogStreamManager : AzureUtilsComponentBase { private Stream _currentStream; private StreamReader _reader; private Thread _pullThread; public event EventHandler LogAvailable; public LogStreamManager(IAzure azure) : base(azure) { } public void StopLogStreaming() { _reader.Dispose(); _currentStream.Dispose(); _reader = null; _currentStream = null; _pullThread = null; } public async Task StartLogStreamingAsync(IWebAppBase webApp) { _currentStream = await webApp.StreamApplicationLogsAsync(); _reader = new StreamReader(_currentStream); if (_pullThread == null) { _pullThread = new Thread(PullThreadMethod); _pullThread.IsBackground = true; _pullThread.Start(); } } private void PullThreadMethod() { while (_currentStream != null) { String line = null; do { try { line = _reader.ReadLine(); if (line != null) { LogAvailable?.Invoke(this, line); } } catch { line = null; } } while (line != null); Thread.Sleep(2000); } } } }