簡體   English   中英

即使我此時沒有實現日志語句,控制台 output 中的錯誤日志來自哪里?

[英]Where do error logs in Console output come from even though I did not implement a logging statement at this point?

我有各種 .NET 6.0 web 應用程序在 Docker 容器中運行。 我使用 Serilog 作為使用builder.Host.UseSerilog()構建的日志庫,然后在通過依賴注入注入的類中使用Microsoft.Extensions.Logging.ILogger<out TCategoryName> 如果發生未處理的錯誤並且此時我沒有實現日志記錄語句,那么該容器的 Docker 日志中會出現錯誤消息。 這個消息是從哪里來的? 由於它不像普通的 Serilog 輸出那樣格式化,它似乎是 .NET 中內置的任何東西。 有沒有辦法重定向這些消息,例如將它們記錄到數據庫中或通過 HTTP 將它們發送到另一個服務?

一個非常簡單的控制台應用程序也是如此:

namespace ConsoleApp1;

internal class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello, World!");
        throw new InvalidOperationException("Hello, World as error");
    }
}

下面的output是哪里來的? 有沒有辦法在不try catch的情況下處理該消息並在任何可能的錯誤發生時手動記錄它們?

Unhandled exception. System.InvalidOperationException: Hello, World as error
   at ConsoleApp1.Program.Main(String[] args) in C:\Users\Admin\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 8

下面的output是哪里來的?

您的程序中有一個未處理的異常。 這意味着您允許異常冒出並從應用程序中冒出,因此 dotnet 運行時被迫為您處理它。

就像Console.WriteLine()命令一樣,運行時會將未處理的異常消息轉儲到 STDOUT。

有沒有辦法在不嘗試捕獲的情況下處理該消息並在任何可能的錯誤發生時手動記錄它們?

我真的建議使用 try/catch - 這就是它的設計目的。 它讓您有時間考慮應用程序的設計,並允許您在處理非常精確的錯誤時執行所有您想要的自定義邏輯。

John Wu還建議AppDomain.UnhandledException Event ,但這或多或少等同於“在整個應用程序周圍放置一個 try/catch 並收工”。

該文檔的示例是:

using System;

public class Example
{
   public static void Main()
   {
      AppDomain currentDomain = AppDomain.CurrentDomain;
      currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

      try {
         throw new Exception("1");
      } catch (Exception e) {
         Console.WriteLine("Catch clause caught : {0} \n", e.Message);
      }

      throw new Exception("2");
   }

   static void MyHandler(object sender, UnhandledExceptionEventArgs args)
   {
      Exception e = (Exception) args.ExceptionObject;
      Console.WriteLine("MyHandler caught : " + e.Message);
      Console.WriteLine("Runtime terminating: {0}", args.IsTerminating);
   }
}
// The example displays the following output:
//       Catch clause caught : 1
//
//       MyHandler caught : 2
//       Runtime terminating: True
//
//       Unhandled Exception: System.Exception: 2
//          at Example.Main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM