是AsyncForwardingAppender
of the Log4Net.Async
package在 ASP.NET MVC Web 应用程序中使用安全吗?我担心它会阻塞可用线程。
归结为我想调用 async
方法以将日志发送到 HTTP API。我可以使用像 the way this guy did it 这样的 async void
方法:
protected override async void Append(log4net.Core.LoggingEvent loggingEvent)
{
var message = new SplunkMessage(loggingEvent.Level, loggingEvent.ExceptionObject);
var success = await _splunkLogger.Report(message);
//do something with the success status, not really relevant
}
他后来updated his code :
public void DoAppend(log4net.Core.LoggingEvent loggingEvent)
{
var clientIp = _clientIpRetriever.GetClientIp();
var message = new SplunkMessage(loggingEvent.Level, loggingEvent.ExceptionObject, clientIp);
SendMessageToSplunk(message);
}
private async void SendMessageToSplunk(SplunkMessage message)
{
try
{
var success = await _splunkLogger.Report(message);
//do something unimportant
}
catch(Exception x)
{
LogLog.Error(GetType(), "Error in SplunkAppender.", x);
}
}
但由于dangers involved,我不敢真正尝试它:“首先,让我指出,‘即发即弃’在 ASP.NET 应用程序中几乎总是一个错误”。
有什么建议吗?
最佳答案
查看 source您可以看到 AsyncForwardingAppender
仅使用一个线程来使事件出队。使用它不会终止您的 MVC 应用程序,因为只会使用一个线程。
将“即发即弃”视为 Web 应用程序中的不良模式,您必须对声明有所保留,因为答案谈到让功能性操作不受监督的危险,不是日志记录。日志记录应该能够在您的应用程序不停止工作的情况下失败(这就是为什么 log4net 在配置或日志记录失败时从不说任何事情)
关于c# - 如何在 ASP.NET MVC Web 应用程序中使用 log4net 异步登录而不用尽所有可用线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28905769/