C# 为什么赢了';我的windows服务不能写入我的日志文件吗?

C# 为什么赢了';我的windows服务不能写入我的日志文件吗?,c#,logging,windows-services,service,nlog,C#,Logging,Windows Services,Service,Nlog,我有一个windows服务,并使用nlog进行日志记录。当我从VisualStudioIDE运行时,一切正常。日志文件更新时没有问题。当我安装该服务时,该服务运行良好,但日志文件从未更新。如果有帮助的话,我将在当地服务机构下运行。是的,我已经在我的应用程序文件夹下创建了日志目录 您的本地服务帐户无权写入指定的文件位置。您可以在“服务属性”对话框的“登录”选项卡中将其设置为使用系统帐户,也可以在安装过程中设置用户帐户。您是否尝试以其他命名用户的身份安装/运行服务 如果这样做有效,那么您可以非常确

我有一个windows服务,并使用nlog进行日志记录。当我从VisualStudioIDE运行时,一切正常。日志文件更新时没有问题。当我安装该服务时,该服务运行良好,但日志文件从未更新。如果有帮助的话,我将在当地服务机构下运行。是的,我已经在我的应用程序文件夹下创建了日志目录



您的本地服务帐户无权写入指定的文件位置。您可以在“服务属性”对话框的“登录”选项卡中将其设置为使用系统帐户,也可以在安装过程中设置用户帐户。

您是否尝试以其他命名用户的身份安装/运行服务

如果这样做有效,那么您可以非常确定您的本地系统帐户没有写入目录/文件的权限问题

您可以使用查看正在执行的文件操作,以及它们失败的原因


我怀疑(和其他回答者一起)这是一个权限问题,因为该服务的帐户没有足够的权限访问该文件。

出于好奇,您是否检查了windows安装的system32目录中是否写入了任何内容?Iirc,这是服务的默认应用程序运行时基本目录…

我也遇到了这个问题。正如genki所提到的,您可能正在登录\Windows\System32目录。也许先检查一下你想要的日志文件。在编写服务时,我经常在开始时放一行这样的代码,以使当前目录的行为与普通应用程序类似

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);

如果您使用的是x64版本的Windows,则日志文件将保存在C:\Windows\SysWOW64文件夹中


如果您使用AnyCPU配置构建项目并将其部署到64位操作系统,则这是默认情况。

我刚刚遇到了与Enterprise framework日志记录相同的问题

总结这个问题,答案一起讲述正确的故事

在您的示例中,当使用Visual Studio IDE时,正在使用应用程序的用户权限写入日志文件,并且正在写入日志文件

Windows服务没有这些相同的权限,因此不会写入日志文件。Windows服务确实有权限(我已经测试过)写入

AppDomain.CurrentDomain.BaseDirectory
使用System.IO命名空间


因此,将日志文件定向到此基本目录,您将是安全的

可能您的服务是在其他用户环境下运行的,也可能是由于Windows的限制。我遇到了同样的问题,并通过登录到以下文件夹解决了该问题:

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

也许这会对你有所帮助。

当我遇到同样的问题时,我发现这篇文章非常有用:


基本上,您希望在配置中包含${basedir}作为文件位置的一部分。这将使NLog从运行可执行文件的位置开始。

为我的服务创建安装项目并多次安装后,我终于意识到我没有将NLog.config文件作为要安装的文件之一。现在它与可执行文件一起包含,它工作得非常好


值得一提的是,NLog.config文件可以在事后手动添加,但服务可能需要停止并重新启动。

您好,这就是我所做的,它的工作很好,您必须创建类库,并在此类中添加以下方法^^

  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 ");

希望这会有帮助。

我遇到了一个与此密切相关的问题。我的NLOG看起来像这样:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
  autoReload="true"
  throwExceptions="false"
  internalLogLevel="Off"
  internalLogFile="c:\temp\nlog-internal.log">

<targets>
<!-- Write events to a file with the date in the filename -->
<target xsi:type="File"
  name="File"
  fileName="${basedir}/logs/${shortdate}.log"
  layout="${longdate} ${uppercase:${level}} ${message}" />
</targets>

<rules>
<!-- Exception levels: Fatal, Error, Warn, Info, Debug, Trace -->
<logger name="*"
  minlevel="Debug"
  writeTo="File" />
</rules>

这一切都与许可有关。首先,在我安装服务的地方,我必须确保本地服务帐户有权读取/写入日志文件夹


其次,internalLogFile虽然未写入,但Nlog似乎会尝试访问,不管如何-这就是为什么我通过再次确保本地服务具有读取/写入**c:\temp**

的权限或仅授予本地服务写入安装程序中该目录的权限来解决问题的原因。我如何授予安装程序中的权限?此外,nlog.config位于项目bin目录中,但未移动到安装文件中。我怎样才能让它发生呢?看起来它不在System32中,它不在System32中,它在SysWOW64中
${basedir}
在nlog中意味着
AppDomain.CurrentDomain.BaseDirectory
,而不是当前目录…谢谢你的提示richard,这让我意识到nlog.config文件不在那里。加载后仍然无法工作,但我确信这是问题的一部分,它确实适用于任何语言,而不仅仅是c#和.net。我为C++ Windows服务提供了这个问题。总是检查这些问题。虽然这是一种日志记录方法,但它并不像一个合适的日志记录框架那样好,它是OP使用和询问的。