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

标签 c# asp.net multithreading asynchronous log4net

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/

相关文章:

c# - 如果我从 C# 代码构建解决方案,我如何知道实际构建了哪些应用程序?

c# - NInject 扩展工厂

javascript - 我的按钮 id 在 javascript 中调用时有效,但 onserverclick 事件无法在 sql 上存储和更新数据

java - 消除僵局

c# - 输出缓存/响应缓存 VaryByParam

c# - 将字符串转换为 float

asp.net - 无法将类型 'X' 的对象转换为类型 'X' - ASP.NET

c# - GridView 行中的动态复选框在 ASP.NET 中未正确显示

java - HashTable 中的 ArrayList 是线程安全的

multithreading - Delphi 上的线程上下文