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
相关产品推荐
相关产品推荐

