NLog刷新事件日志源后抛出UnauthorizedAccessException异常原因咨询
我已启用NLog内部日志排查日志偶尔停止的问题,目前遇到一个异常:使用AsyncTargetWrapper包装、ConcurrentWrites=true的FileTarget抛出System.UnauthorizedAccessException,提示无法访问路径C:\ProgramData\Company\Logs\AllExceptions.txt。该文件此前已创建,多个运行中应用都能正常写入,所有应用均使用NLog 5.2.8版本,异常在开发机器触发,当时无人工干预。
相关FileTarget配置
var fileTarget = new FileTarget(); _config.AddTarget("file", new AsyncTargetWrapper(fileTarget)); fileTarget.FileName = "${gdc:logDirectory:whenEmpty=${gdc:defaultLogPath}}/${gdc:iisApplicationName:whenEmpty=${processname}}/${logger}.txt"; fileTarget.Layout = @"${longdate}: thread:${threadid} - ${level} ${message}"; fileTarget.ArchiveEvery = FileArchivePeriod.Day; fileTarget.ArchiveNumbering = ArchiveNumberingMode.Date; fileTarget.ArchiveFileName = "${gdc:logDirectory:whenEmpty=${gdc:defaultLogPath}}/${processname}/Archive/${logger}.{#}.txt"; fileTarget.ArchiveDateFormat = "yyyyMMdd"; fileTarget.MaxArchiveFiles = 10;
实际写入路径解析为:C:\ProgramData\CompanyName\Application\Logs\ServiceX(Archive)\File.txt
错误日志详情
2024-07-22 12:35:33.2512 Debug EventLogTarget([unnamed]): Refresh EventLog Source Company.WCF.Client.Console - Client and Log Application 2024-07-22 12:35:33.2512 Debug FileTarget([unnamed]): Preparing for new file: 'C:\ProgramData\Company\Logs\AllExceptions.txt' 2024-07-22 12:35:33.2512 Debug FileTarget([unnamed]): Creating file appender: 'C:\ProgramData\Company\Logs\AllExceptions.txt' 2024-07-22 12:35:33.2512 Warn FileTarget([unnamed]): Failed to create file appender: C:\ProgramData\Company\Logs\AllExceptions.txt Exception: System.UnauthorizedAccessException: Access to the path 'C:\ProgramData\Company\Logs\AllExceptions.txt' is denied. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) at System.IO.FileStream..ctor(String path, FileMode mode, FileSystemRights rights, FileShare share, Int32 bufferSize, FileOptions options) at NLog.Internal.FileAppenders.WindowsMultiProcessFileAppender.CreateAppendOnlyFile(String fileName) at NLog.Internal.FileAppenders.WindowsMultiProcessFileAppender..ctor(String fileName, ICreateFileParameters parameters) at NLog.Internal.FileAppenders.WindowsMultiProcessFileAppender.Factory.NLog.Internal.FileAppenders.IFileAppenderFactory.Open(String fileName, ICreateFileParameters parameters) at NLog.Internal.FileAppenders.FileAppenderCache.CreateAppender(String fileName, Int32 freeSpot)
异常触发的可能原因
- 文件锁定冲突:归档操作(ArchiveEvery=Day)触发时,可能有其他进程或同一进程的其他线程正在独占该文件。比如归档过程中需要重命名原文件,若存在未释放的文件句柄,会导致权限被临时锁定。
- Windows权限临时变更:开发机器上的杀毒软件、组策略或系统服务可能在后台修改了文件/文件夹权限。比如实时防护扫描日志文件时,会临时锁定文件并修改访问权限,导致NLog无法写入。
- 进程身份权限差异:错误日志中的
AllExceptions.txt对应特定logger,检查该logger所属应用进程是否以不同身份运行(如普通用户vs管理员),引发权限差异。 - NLog文件追加器缓存问题:FileAppenderCache创建新的WindowsMultiProcessFileAppender时,缓存中的旧句柄未正确释放,导致新创建请求被系统拒绝。AsyncTargetWrapper的异步队列可能在归档完成前继续发送日志请求,引发冲突。
- 文件系统临时故障:开发机器C盘可能存在NTFS权限继承失效、文件被临时标记为只读等文件系统错误,导致原本可写入的文件突然无法访问。
内容的提问来源于stack exchange,提问作者Dries
相关产品推荐
相关产品推荐

