【发布时间】: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