29

我有一个 Windows 服务并使用 nlog 进行日志记录。当我从 Visual Studio IDE 运行时,一切正常。日志文件更新没有问题。当我安装服务时,服务运行良好,但日志文件永远不会更新。如果有帮助,我正在本地服务下运行。是的,我已经在我的应用程序文件夹下创建了日志目录。

 <?xml version="1.0" encoding="utf-8" ?>
 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >

  <targets>
    <target name="file" xsi:type="File" fileName="${basedir}/logs/${shortdate}_info.txt"
            layout="${date} ${logger} ${message}" />
  </targets>

  <rules>
    <logger name="*" minlevel="Info" maxlevel="Info" writeTo="file" />
  </rules>
</nlog>
4

12 回答 12

30

我也遇到过这个问题。正如 genki 所提到的,您可能正在登录到 \Windows\System32 目录。也许首先检查您期望在那里的日志文件。在编写服务时,我经常在开头放这样一行,让当前目录表现得像一个普通的应用程序

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
于 2009-05-13T16:17:03.123 回答
13

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

于 2009-05-13T15:20:21.533 回答
13

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

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

于 2011-04-09T10:30:01.300 回答
2

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

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

于 2009-05-13T15:34:19.340 回答
2

只是出于好奇,您是否检查过Windows安装的system32目录中是否有任何内容?Iirc,这是服务的默认应用程序运行时基目录...

于 2009-05-13T16:08:37.927 回答
2

我刚刚在企业框架日志记录方面遇到了同样的问题。

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

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

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

AppDomain.CurrentDomain.BaseDirectory

使用 System.IO 命名空间。

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

于 2012-05-24T21:00:10.270 回答
2

当我遇到同样的问题时,我发现这篇文章很有帮助:

http://nlog-forum.1685105.n2.nabble.com/Nlog-not-working-with-Windows-service-tp6711077p6825698.html

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

于 2013-02-11T21:50:32.873 回答
1

您是否尝试过以不同的命名用户身份安装/运行您的服务。

如果可行,那么您可以确定您的本地系统帐户没有权限写入目录/文件的权限问题。

于 2009-05-13T15:20:49.363 回答
0

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

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

也许这会对你有所帮助。

于 2012-10-08T07:10:55.693 回答
0

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

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

于 2013-02-20T21:20:38.587 回答
0

我有一个非常密切相关的问题。我的 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>

这都是与许可相关的。首先,在我安装服务的地方,我必须确保 LOCAL SERVICE 帐户有权读取/写入Logs文件夹。

其次,虽然没有写入 internalLogFile,但 Nlog 似乎无论如何都在尝试访问 - 这就是为什么我通过再次确保 LOCAL SERVICE 有权在 **c:\temp** 中读取/写入来解决我的问题

于 2018-05-09T08:35:18.480 回答
-4

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

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

希望这会有所帮助。

于 2016-03-04T08:45:06.803 回答