使用NLog的两个Windows服务出现异常:空引用与权限问题求助
Windows服务NLog异常排查解决指南
一、System.NullReferenceException(Logging.NLogger构造函数触发)
- 检查NLog配置文件完整性:确认
nlog.config的XML结构完整,<targets>、<rules>等核心节点无缺失或语法错误,比如标签未闭合、属性值未正确用引号包裹。 - 验证自定义封装类的初始化逻辑:如果
Logging.NLogger是你自己封装的NLog工具类,检查构造函数中是否正确获取Logger实例(比如var logger = LogManager.GetCurrentClassLogger();),同时确认配置文件加载逻辑无空引用(比如未正确指定配置文件路径导致加载失败)。 - 核对依赖版本一致性:确保部署的
nlog.dll版本与项目编译时引用的版本完全一致,版本不匹配可能导致初始化时内部对象为空。 - 排查构造函数内的空值调用:检查
Logging.NLogger构造函数中是否有未初始化的成员变量,或调用了可能返回null的方法但未做判空处理。
二、System.UnauthorizedAccessException(NLog写入日志文件权限不足)
- 为日志目录添加服务账号权限:找到NLog配置中指定的日志存储目录,右键打开「属性」-「安全」,添加服务运行账号(如
Local System、Network Service或自定义账号),并赋予写入和修改权限。 - 更换日志存储路径:若当前日志目录(如程序安装目录)属于系统受保护区域,将NLog配置中的
fileName改为C:\ProgramData\YourServiceName\Logs\${shortdate}.log这类默认允许服务写入的目录。 - 确认服务运行账号权限:检查Windows服务的「登录」属性,若使用自定义账号,需确保该账号属于有权限访问日志目录的用户组(如Users组);若使用
Local System,需确认日志目录未被设置为严格权限限制。 - 避开系统敏感目录:不要将日志写入
C:\Windows、C:\Program Files等系统默认受保护目录,这些目录需要管理员权限才能写入,普通服务账号无法操作。
内容的提问来源于stack exchange,提问作者Javeria
相关产品推荐
相关产品推荐

