NLog程序崩溃前无法完整记录日志 如何调用Flush及提高刷入频率?
NLog 4.7.10 日志刷入方案
1. 手动执行Flush操作的正确方法
NLog 4.7.10 版本仍然保留了刷入相关的API,找不到方法请先确认项目已正确引用完整的NLog NuGet包,且代码顶部已引入NLog命名空间,可用调用方式如下:
- 同步阻塞式刷入(等待所有日志落盘后再继续执行)
// 参数为最大等待超时时间,可根据业务场景调整 LogManager.Flush(TimeSpan.FromSeconds(3)); - 异步非阻塞式刷入(适合异步代码场景)
await LogManager.FlushAsync(TimeSpan.FromSeconds(3)); - 针对指定日志目标单独刷入(不需要全量刷入时使用)
// 比如仅刷入文件日志目标 var fileTarget = LogManager.Configuration.FindTargetByName<FileTarget>("你的文件目标名称"); fileTarget?.Flush();
2. 提高自动刷入频率的配置方案
你可以通过修改NLog配置实现更频繁的自动刷入,不需要手动埋点也能避免日志延迟:
- 开启单条日志自动刷入:给对应的写入目标(最常用的是FileTarget)添加
autoFlush="true"配置,每次写入日志都会直接触发刷入,完全没有缓冲区延迟,适合崩溃排查阶段使用 - 调整定时刷入间隔:如果担心单条刷入影响性能,可以设置
flushTimeout参数,单位为毫秒,比如设置flushTimeout="500"即每500毫秒自动刷入一次 - 异步包装器优化:如果你的日志目标外层套了AsyncTargetWrapper异步包装,可将
batchSize参数调小(默认值为100,可调整为10~20),攒够指定条数就触发刷入,同时添加overflowAction="Flush"配置,避免队列溢出时丢日志
配置文件示例参考:
<nlog> <targets> <!-- 单条自动刷入的文件日志配置 --> <target name="fileLog" xsi:type="File" fileName="app.log" autoFlush="true" keepFileOpen="true" /> <!-- 定时刷入+异步优化的配置示例 --> <target name="asyncFileLog" xsi:type="AsyncWrapper" batchSize="10" overflowAction="Flush"> <target xsi:type="File" fileName="app_async.log" flushTimeout="500" keepFileOpen="true" /> </target> </targets> </nlog>
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

