2017-02-25 81 views
1

目前我有一個Web服務項目,在啓動代碼我創建了一個記錄器從Serilog像這樣:上傳的Web服務項目生成的文件到Azure的Blob存儲

public Startup() 
     { 
      Log.Logger = new LoggerConfiguration() 
       .MinimumLevel.Debug() 
       .WriteTo.File(AppDomain.CurrentDomain.BaseDirectory + "\\logs\\logs--"+ string.Format("{0:yyyy-MM-dd_hh-mm-ss-tt}", DateTime.Now) + ".log", outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}",shared:true) 
       .CreateLogger(); 
     } 

當web應用程序關閉,日誌文件將在項目域文件夾中本地創建。我想使用Azure Blob存儲上傳此文件。我的問題是,我無法知道應用程序何時會因爲任何原因而關閉,如果發生錯誤或開發人員使用它。我想將他們會話中的所有日誌上傳到一個blob。 Web服務代碼中是否有一個區域會在它關閉之前去到,因此我可以將其上傳到那裏?

謝謝你!

***編輯****

我加在全局文件的方法:

protected void Application_End() 
     { 
      Log.Debug("We made it to application end"); 
      Log.CloseAndFlush(); 


     } 

回答

0

我建議你可以嘗試添加Global.asax文件。 據我所知我們可以使用Application_End方法來達到這個目的。

當ASP.NET工作進程終止時,會觸發Application_End。這通常發生在可配置的非活動時段之後,或者IIS(或相關應用程序池)關閉或重新啓動時。

我在我的電腦上寫了一個測試演示。 我使用Application_Start方法開始記錄細節。我用來將文件參數傳遞給application_end的靜態變量「text」。

更多細節,你可以參考下面的代碼:

的Global.asax:

public class Global : System.Web.HttpApplication 
    { 
      static string text; 
     protected void Application_Start(object sender, EventArgs e) 
     { 
      text = AppDomain.CurrentDomain.BaseDirectory + "\\logs\\logs--" + string.Format("{0:yyyy-MM-dd_hh-mm-ss-tt}", DateTime.Now) + ".log"; 

      Log.Logger = new LoggerConfiguration() 
       .MinimumLevel.Debug() 
       .WriteTo.File(text, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}", shared: true) 
       .CreateLogger(); 
      Log.Information("Hello, world!"); 

      int a = 10, b = 0; 
      try 
      { 
       Log.Debug("Dividing {A} by {B}", a, b); 

      } 
      catch (Exception ex) 
      { 
       Log.Error(ex, "Something went wrong"); 
      } 
     } 

     protected void Application_End(object sender, EventArgs e) 
     { 
      CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
         "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); 

      CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 


      CloudBlobContainer container = blobClient.GetContainerReference("mycontainer"); 
      string text2 = text; 

      CloudBlockBlob blockBlob = container.GetBlockBlobReference(string.Format("{0:yyyy-MM-dd_hh-mm-ss-tt}", DateTime.Now) + ".log"); 

      Log.CloseAndFlush(); 


      using (var fileStream = System.IO.File.OpenRead(text)) 
      { 
       blockBlob.UploadFromStream(fileStream); 
      } 
     } 
    } 

結果: enter image description here

希望這可以給你一些提示。

+0

我添加了方法本身只是爲了看看它會在Web瀏覽器關閉但是沒有關閉的時候進入方法。有什麼我做錯了嗎?我把我改變在OP – JPhillips

+0

我可以讓應用程序到達Application_End的唯一方法是通過停止IIS Express。我正在尋找一些能夠讓我只需在運行中按停止就能到達那裏的東西。 – JPhillips

相關問題