[英]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.