簡體   English   中英

在ASP.NET Core中處理ILoggerFactory

[英]Disposing of ILoggerFactory in ASP.NET Core

在我的ASP.NET核心項目中,我在ILoggerFactory上編寫了一個擴展,它添加了一個自定義的ILoggerProvider (與NLog.Extensions.Logging類似)

我在Startup.cs添加了這個:

loggerFactory.AddRabbitLogger(Configuration.GetSection(nameof(WebLoggerOptions)));

日志記錄工作正常,但它會向RabbitMQ發送消息,這意味着它會打開一個連接和一個通道。 這些不能保持打開所以我關閉Dispose的通道和連接( ILoggerProvider已經從IDisposable繼承)

我的測試成功但問題是我的測試輸出總是顯示此錯誤

Error while unloading appdomain. (Exception from HRESULT: 0x80131015)

另一個問題是,測試完成后需要幾秒鍾來顯示錯誤,因此我無法啟動任何新測試。

有沒有辦法在我的測試中觸發記錄器提供程序的處理?

這是我的集成測試的代碼。 如你所見,我正在TearDown處理

集成測試

public abstract class TestBase
{
    private TestServer _server;
    protected HttpClient TestHttpClient { get; private set; }

    [SetUp]
    protected void BaseSetup()
    {
        _server = new TestServer(new WebHostBuilder()
            .UseStartup<Startup>());
        TestHttpClient = _server.CreateClient();
    }       

    [TearDown]
    public void TearDown()
    {
        TestHttpClient.Dispose();
        _server.Dispose();
    }
}

public class MyTestClass : TestBase
{
    [Test]
    public async Task SendTest()
    {
        requestUrl = "api/ControllerName/Mehthod";
        var response = await TestHttpClient.PostAsync(requestUrl, pardotFormCommand, GetMediaTypeFormatter());
        response.StatusCode.Should().Be(HttpStatusCode.OK);            
    }        
}

我能夠通過更改我的ILoggerFactory擴展庫來解決這個問題。 我也遇到過使用這種擴展的控制台應用程序的問題,但只有在我使用ILogger實現的多個服務時才會出現問題。

在提供程序(從ILoggerProvider派生)中有一個CreateLogger方法。 我發現在一個提供程序中你可以有多個記錄器(例如,每個asp.net控制器一個或者你的控制台應用程序中的每個服務)。 我錯誤地認為每個記錄器都有它自己的提供者,我只處理了一個ILogger (最后一個)。

當我將ILoggerProvider代碼更改為此時,我的單元測試中不再出現掛起或錯誤

public ILogger CreateLogger(string categoryName)
{
    var companyLogger = new CompanyLogger(categoryName, _loggerOptions);
    _companyLoggers.Add(companyLogger);

    return companyLogger;
}

public void Dispose()
{
    foreach (var logger in _companyLoggers)
    {
        logger.Dispose();
    }           
}

簡而言之,如果要編寫一個帶有需要處理的ILogger類的自定義ILoggerFactory ,則必須將ILogger對象保存在ILoggerProvider的私有列表中,並在調用Dispose時將它們全部Dispose 如果您的ILogger不需要像NLog那樣處理,您不必擔心這一點。

暫無
暫無

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

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