为什么我的Windows服务不会写入我的日志文件?
我有一个Windows服务并使用nlog进行日志记录。 当我从visual studio ide运行时,一切正常。 日志文件更新没有问题。 当我安装该服务时,该服务运行正常,但日志文件永远不会更新。 如果有帮助,我在LOCAL SERVICE下运行。 是的,我在我的应用程序文件夹下创建了logs目录。
您的本地服务帐户无权写入指定的文件位置。 您将其设置为在服务属性对话框的“登录”选项卡中使用系统帐户,或者您可以在设置过程中设置用户帐户。
我也遇到过这个问题。 正如genki所提到的,您可能正在登录 Windows System32目录。 也许先检查一下你期望的日志文件。 在编写服务时,我经常在开头添加这样一行,以使当前目录像普通应用程序一样运行
Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
如果您使用的是x64版本的Windows,则日志文件保存在C: Windows SysWOW64文件夹中
如果使用AnyCPU配置构建项目并部署到64位操作系统,则这是默认情况。
您可以使用Process Monitor查看正在执行的文件操作以及它们失败的原因。
我怀疑(以及其他回答者)这是一个权限问题,服务的帐户没有足够的文件访问权限。
当我遇到同样的问题时,我发现这篇文章非常有用:
https://nlog-forum.1685105.n2.nabble.com/Nlog-not-working-with-Windows-service-tp6711077p6825698.html
基本上,您需要在配置中包含$ {basedir}作为文件位置的一部分。 这将使NLog从运行可执行文件的位置开始。
您是否尝试以不同的命名用户身份安装/运行服务。
如果可以,那么您可以非常确定您的本地系统帐户无权写入目录/文件的权限问题。
出于好奇,您是否检查过Windows安装的system32目录中是否写入了任何内容? Iirc,这是服务的默认应用程序运行时基目录…
我刚刚遇到了与Enterprise框架日志记录相同的问题。
总结这个问题,答案一起讲述了正确的故事。
在您的示例中,使用Visual Studio IDE时,正在使用应用程序的用户权限写入日志文件,并且正在写入日志文件。
Windows服务没有这些相同的权限,因此不会写入日志文件。 Windows服务确实有权限(我已经测试过这个)写入
AppDomain.CurrentDomain.BaseDirectory
使用System.IO命名空间。
因此,将日志文件定向到此基本目录,您将是安全的。
这可能是您的服务在其他用户上下文中运行,也是因为Windows限制。 我有同样的问题并解决了它登录到以下文件夹:
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
也许这会对你有所帮助。
在为我的服务创建安装项目并多次安装之后,我终于意识到我没有将NLog.config文件作为要安装的文件之一。 现在它与可执行文件一起包含在内,它运行得很好。
对于它的价值,可以在事后手动添加NLog.config文件,但可能需要停止并重新启动该服务。
我有一个非常密切相关的问题。 我的NLOG看起来像这样:
这是所有相关的许可。 首先,在我安装服务的地方,我必须确保LOCAL SERVICE帐户有权读取/写入Logs文件夹。
其次,内部LogFile虽然没有写入,但Nlog似乎无论如何都尝试访问 – 这就是为什么我再次确保LOCAL SERVICE有权读取/写入** c: temp **解决了我的问题
嗨这是我做的,它的工作很好你必须创建类库,并在这个类中添加以下方法^^
public static void WriteErrorLog(Exception ex) { StreamWriter sw = null; try { sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\LogFile.txt", true); sw.WriteLine(DateTime.Now.ToString() + ":" + ex.Source.ToString().Trim() + ":" + ex.Message.ToString().Trim()); sw.Flush(); sw.Close(); } catch { } } public static void WriteErrorLog(String Message) { StreamWriter sw = null; try { sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\LogFile.txt", true); sw.WriteLine(DateTime.Now.ToString() + ":"+Message); sw.Flush(); sw.Close(); } catch { } }
并且在您的服务中,您必须使用OnStart方法:
Library.WriteErrorLog(" Service Started "); //and in your OnStop method Library.WriteErrorLog(" Service Stoped ");
希望这会有所帮助。
上述就是C#学习教程:为什么我的Windows服务不会写入我的日志文件?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/987691.html