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

.NET Core 6中NLog在特定用户账户下无法写入部分日志目标

问题排查与解决方案

核心问题分析

从描述来看,nonworkinglog无法写入的关键线索是:内部日志中缺失SecondLogger的目标映射日志,且仅在账户#1运行服务时出现问题。结合配置和环境信息,重点排查以下几点:


1. 修复文件名中的非法字符(优先级最高)

你的nonworkinglog目标使用了${longdate}作为文件名部分,而${longdate}的默认格式是yyyy-MM-dd HH:mm:ss.fffffff,其中包含冒号(:)——这是Windows文件名的非法字符,会直接导致文件创建失败。

修正方案:
将nonworkinglog的fileName修改为不含非法字符的格式,比如:

<target xsi:type="File" name="nonworkinglog" fileName="d:\logs\ABCFolder\Subfolder\sublog-${date:format=yyyy-MM-dd_HH-mm-ss}.json"
    maxArchiveDays="14" layout="${message}" />

或者使用无特殊字符的时间变量,如${ticks}(时间戳):

fileName="d:\logs\ABCFolder\Subfolder\sublog-${ticks}.json"

2. 提升NLog内部日志级别以获取细节

当前内部日志级别为Info,无法捕获Debug级别的配置加载细节。将internalLogLevel改为Debug,查看完整的日志器规则匹配过程:

internalLogLevel="Debug"

重启服务后,检查nlog-internal.log,确认:

  • 是否加载了正确的nlog.config文件
  • SecondLogger的规则是否被正确识别并绑定到nonworkinglog目标
  • 是否有文件创建失败的错误日志(比如文件名非法、权限不足)

3. 验证日志器名称的精确匹配

NLog的日志器名称默认区分大小写,请确认代码中创建日志器的语句严格匹配配置中的SecondLogger:

// 确保名称完全一致,包括大小写
var logger = LogManager.GetLogger("SecondLogger");

如果代码中拼写错误(如secondLogger或Secondlogger),会导致规则无法匹配,日志不会写入nonworkinglog。


4. 确认服务账户的路径访问权限

即使已赋予文件夹完全控制权限,仍需验证:

  • 账户#1是否能直接访问D:\logs\ABCFolder\Subfolder:用账户#1登录服务器,手动在该目录创建文件,确认操作正常。
  • 若D:是网络映射驱动器,服务账户(如LocalService、NetworkService)默认无法访问网络共享,需改用UNC路径(如\\server\share\logs\ABCFolder\Subfolder),并确保账户#1有网络共享的访问权限。
  • 检查权限是否生效:修改权限后需重启服务,避免权限缓存导致的问题。

5. 确认配置文件的加载路径

服务运行时的工作目录可能与命令行不同,导致加载的nlog.config不是预期文件。在内部日志中查找类似以下的日志行,确认配置文件路径正确:

Debug Loading configuration from file 'C:\path\to\your\service\nlog.config'

如果路径错误,需将nlog.config放在服务的工作目录下,或在代码中指定配置文件路径:

LogManager.LoadConfiguration("path/to/nlog.config");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:10:56