.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

