簡體   English   中英

如何在 .NET Core 中的 logCritical 之后停止控制台應用程序

[英]How to stop console app after logCritical in .NET Core

我希望我的控制台應用程序在 ILogger 使用 logError 或 logCritical 后停止。 那可能嗎 ?

例如,我將 ILogger 注入到一個類中,該類假設從外部 api 獲得一些結果:

        public WebsiteApiServices(ILogger<WebsiteApiServices> logger)
        {
            _logger = logger;
        }

我從外部 api 得到響應:

public TransactionDetails GetResultsFromApi(HttpClient client, string txnHash){
    var jsonResponse = await GetJsonResponse(client, txnHash);

    TransactionDetails result = null;
    try
    {
        result = JsonConvert.DeserializeObject<EtherscanTransactionByHashSuccessfulResponse>(jsonResponse).Result;
    }
    catch (JsonSerializationException)
    {
        var failReason = JsonConvert.DeserializeObject<EtherscanTransactionByHashFailedResponse>(jsonResponse).Result;
        switch (failReason)
        {
            case "Invalid API Key":
                _logger.LogCritical($"API response: \"{failReason}\"");
                State.ExitAndLog(new StackTrace(), _logger);
                break;
        }
    }
    return result;
}

因此,如果 API 密鑰無效,我希望我的控制台應用程序退出代碼。 我想要這個,因為這個方法被重復使用,所以我不想一直向外部 API 發送無效請求。

那可能嗎?

是的,但這非常不尋常。 通常,異常情況通過拋出異常來指示,應用程序可以決定如何處理這些異常。 例如,您可以定義一個由 API 代碼拋出的InvalidApiKeyException ,當異常到達頂級應用程序代碼時,應用程序將決定退出。

也就是說,您可以讓關鍵日志關閉您的應用程序。 執行此操作的適當方法是定義您自己的日志記錄提供程序,並在任何記錄關鍵消息時調用IApplicationLifetime.StopApplication 請注意,應用程序不會立即停止; 它將從LogCritical方法正常返回並正常關閉。

如果您想要硬停止,請調用Environment.FailFast而不是StopApplication 請注意,當使用FailFast時,關鍵消息實際上可能不會被記錄,因為許多(大多數?)日志記錄提供程序會緩存他們的日志,並且當應用程序立即停止時實際上並沒有機會刷新該緩存。

暫無
暫無

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

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