You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

nLog日志API部署至服务器后部分请求丢失问题排查求助

诊断步骤(生产环境)
  • 启用NLog内部日志:在NLog.config中添加内部日志配置,捕获NLog初始化、数据库连接及写入过程的细节,排查权限不足、连接超时或SQL语法错误等问题:
    <nlog internalLogLevel="Trace" internalLogFile="D:\Logs\nlog-internal.log">
      <!-- 原有配置 -->
    </nlog>
    
  • 检查IIS应用池配置:
    • 验证应用池身份权限:确认应用池使用的账户(如ApplicationPoolIdentity、Network Service)拥有数据库的写入权限,避免因权限不足导致日志写入失败。
    • 查看应用池回收设置:检查是否存在频繁回收(如内存阈值、定时回收),回收过程中未处理的请求可能被直接丢弃。
  • 开启IIS详细站点日志:在IIS站点的日志设置中,启用详细日志记录(包含请求状态码、请求大小、客户端IP等),确认丢失的请求是否真的未到达服务器,或到达后返回了异常状态码(如500、403)。
  • 捕获API未处理异常:在ASP.NET Core中添加全局异常中间件,记录日志API自身的异常信息,排查是否因请求处理过程中崩溃导致日志丢失:
    app.UseExceptionHandler(errorApp =>
    {
        errorApp.Run(async context =>
        {
            var exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>();
            if (exceptionHandlerPathFeature?.Error != null)
            {
                logger.LogError(exceptionHandlerPathFeature.Error, "日志API处理请求时出错");
            }
            context.Response.StatusCode = StatusCodes.Status500InternalServerError;
            await context.Response.WriteAsync("日志处理失败");
        });
    });
    
  • 排查网络与防火墙:确认服务器防火墙/安全组未拦截日志请求,检查是否存在WAF规则拦截包含特殊内容的错误、追踪日志请求;同时验证客户端到服务器的网络连通性,排查是否因网络波动导致请求丢失。
  • 检查数据库性能与连接:
    • 查看数据库的等待事件、连接池状态,确认是否存在连接耗尽、锁等待或高负载导致NLog写入超时。
    • 在NLog数据库目标中显式设置commandTimeout,避免因默认超时过短导致写入失败:
      <target xsi:type="Database" name="db" connectionString="..." commandTimeout="30">
        <!-- 原有命令配置 -->
      </target>
      
确保日志请求全量处理的方案
  • 配置NLog fallback机制:当数据库写入失败时,将日志降级写入本地文件,避免日志丢失,后续可手动导入数据库:
    <fallbackGroup name="logFallback">
      <target xsi:type="Database" name="dbTarget" connectionString="..." />
      <target xsi:type="File" name="fileTarget" fileName="D:\Logs\fallback-${shortdate}.log" />
    </fallbackGroup>
    
  • 优化NLog数据库写入性能:
    • 启用异步写入:在数据库目标中设置async="true",避免阻塞请求处理线程。
    • 开启批量写入:配置batchSize参数,将多条日志批量插入数据库,减少连接开销:
      <target xsi:type="Database" name="db" connectionString="..." async="true" batchSize="100">
        <!-- 原有命令配置 -->
      </target>
      
  • 增加请求重试机制:
    • 客户端侧:对日志请求添加重试逻辑(如最多重试3次,间隔1秒),应对网络波动或临时服务不可用。
    • API侧:使用Polly等库实现数据库写入的重试策略,处理临时数据库连接失败:
      var retryPolicy = Policy.Handle<SqlException>()
                            .WaitAndRetry(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
      retryPolicy.Execute(() => { /* 执行数据库写入操作 */ });
      
  • 强化权限与配置校验:
    • 确保发布时NLog.config被正确复制到服务器的应用目录,避免因配置缺失导致NLog使用默认规则。
    • 使用SQL Server身份验证(在连接字符串中指定用户名密码),替代Windows身份验证,减少权限配置复杂度。
  • 监控与告警:
    • 在日志API中添加监控指标(如每分钟处理日志数、失败数),通过监控工具实时追踪日志处理状态。
    • 设置告警规则,当日志失败率超过阈值时及时通知运维人员。
  • 调整IIS应用池设置:
    • 禁用或调整快速失败保护阈值,避免因API临时异常导致应用池被关闭,进而丢失后续请求。
    • 增加应用池的队列长度,避免高并发场景下请求被拒绝。

内容的提问来源于stack exchange,提问作者Archana Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:42:22