C# 如何在ASP.NET MVC Web应用程序中使用log4net异步登录,而不使用所有可用线程?

C# 如何在ASP.NET MVC Web应用程序中使用log4net异步登录,而不使用所有可用线程?,c#,asp.net,multithreading,asynchronous,log4net,C#,Asp.net,Multithreading,Asynchronous,Log4net,在ASP.NET MVC Web应用程序中使用是否安全?我担心它会阻塞可用的线程 归根结底,我想调用async方法将日志发送到HTTP API。我可以使用异步void方法,如: 他后来说: 但我实在不敢尝试,因为:“首先,让我指出,在ASP.NET应用程序中,“开火并忘记”几乎总是一个错误。” 有什么建议吗?查看,您可以看到出现的AsyncForwardingAppender只使用一个线程来将事件出列。使用它不会杀死你的MVC应用程序,因为只会使用一个线程 在web应用程序中,“开火并忘记”是一

在ASP.NET MVC Web应用程序中使用是否安全?我担心它会阻塞可用的线程

归根结底,我想调用
async
方法将日志发送到HTTP API。我可以使用
异步void
方法,如:

他后来说:

但我实在不敢尝试,因为:“首先,让我指出,在ASP.NET应用程序中,“开火并忘记”几乎总是一个错误。”

有什么建议吗?

查看,您可以看到出现的
AsyncForwardingAppender
只使用一个线程来将事件出列。使用它不会杀死你的MVC应用程序,因为只会使用一个线程


在web应用程序中,“开火并忘记”是一种不好的模式,你必须在声明中添加一点盐,因为答案谈到了让功能操作在无人监督的情况下进行的危险,而不是让日志记录操作。日志记录应该能够在应用程序不停止工作的情况下失败(这就是为什么log4net在配置或日志记录失败时从不说任何话)

您可以使用生产者/消费者模式,该模式将使用2个线程。更新了我的问题,以更好地反映我正在构建的应用程序类型(ASP.NET MVC Web应用程序)。永久保留一个后台线程用于在这样的环境中登录,这真的是一个好主意吗?这取决于您的设置。只要您不为每个请求生成一个单独的线程(即将它们作为单线程注入),我不明白为什么不这样做。在我见过的许多web服务器上,它们只订阅一次外部队列,例如,这些队列将在它们自己的线程中订阅。至少,这比每次需要登录时生成新线程要好。[续]。。。如果您滥发日志(在web环境中不应该这样做),您将遇到麻烦,但如果您生成日志的速度快于日志的消耗速度,那么无论您的解决方案如何,您都会遇到麻烦。我个人的观点是使用这个库,在压力下测试它,如果它没有引起问题,就保留它。如果是,请使用您自己的队列。我很感激你真的担心在web环境中使用后台线程(我也一样!),但这是解决你所描述的问题的标准模式。一点问题也没有。祝你好运
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
}
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);
    }            
}