【问题标题】:Topshelf, NLog and File PermissionsTopshelf、NLog 和文件权限
【发布时间】:2014-02-24 16:21:29
【问题描述】:

我有一个使用 TopShelf 库的 Windows 服务应用程序,我在 cfn-init 期间使用您从 topshelf 获得的便捷命令行功能将其安装在 AWS 中。

C:\handy_service\> HandyService.exe install start

这基本上是在注册表中安装服务,然后调用sc start,但它非常有用,因为它会检查服务名称是否符合您的期望,并且它允许您配置服务将运行的用户,使用流畅的 API .

如果服务配置为一般使用 NLog,安装程序代码还会将一些诊断日志写入 NLog。

问题在于:安装程序作为 AMI 启动的默认本地管理员帐户运行,并且 NLog 文件由该用户创建。当服务以网络服务用户身份启动时,它没有写入 NLog 日志文件的权限。

如何让我的服务写入日志文件?我考虑过以编程方式设置权限,但它看起来很讨厌,我必须确定日志文件名,因为它是根据 ec2 实例 ID 动态生成的。此外,第一次创建日志文件的时间也不是很明显。我可能会采用的最简单的方法是拥有两个 NLog.config,并在刷新记录器后在安装结束时切换一个。但是由于服务启动和安装程序退出之间存在一些时间重叠,我预计我会在这里丢失几行日志记录。

任何干净的建议将不胜感激!

【问题讨论】:

  • 要清楚,问题是安装命令会像您一样创建日志文件的实例。然后服务运行并且无权访问该文件?如果是这种情况,最简单的“hack”可能是删除安装和服务启动之间的日志。使用 net start service 而不是通过 Topshelf。
  • 没错,install/start 命令在当前(管理员)用户的上下文中有效地将应用程序作为控制台应用程序运行,因此创建的任何文件都归该用户所有。当服务以网络服务用户身份正常启动时,日志文件已经存在,无法写入。
  • 是的。对于那个问题,我认为我没有解决方案。要么更改运行它的用户,修改权限(呃),要么删除日志,这样就不是问题了。您可以选择在服务启动之前不初始化 nlog,这样“安装启动”也不会让您感到困惑。

标签: windows amazon-web-services file-permissions nlog topshelf


【解决方案1】:

最后,我在部署时设置了日志文件夹的权限。使用icacls 实际上非常简单,例如,只有几行 rake,假设您知道您的日志文件夹将在哪里:

sh %{icacls "#{logs_dir}" /grant "#{username}":(OI)(W)}

在服务配置中不调用 UseNLog() 也是一个简单的选项,在这种情况下,任何安装时错误都会出现在 Windows 事件日志中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2012-03-02
    • 2011-11-09
    • 2011-08-19
    • 2023-04-01
    • 2011-06-13
    • 2012-01-06
    相关资源
    最近更新 更多