为啥我的 Windows 服务不会写入我的日志文件?
Posted
技术标签:
【中文标题】为啥我的 Windows 服务不会写入我的日志文件?【英文标题】:Why won't my windows service write to my log file?为什么我的 Windows 服务不会写入我的日志文件? 【发布时间】:2010-10-25 21:47:33 【问题描述】:我有一个 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>
【问题讨论】:
真的适用于任何语言,而不仅仅是 c# 和 .net。我的 c++ windows 服务遇到了这个问题。 始终检查internal log 是否存在此类问题。 【参考方案1】:我遇到了一个非常相关的问题。我的 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** 中读取/写入来解决我的问题
【讨论】:
【参考方案2】:嗨,这就是我所做的,它工作得很好,你必须创建类库,并在这个类中添加以下方法 ^^
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 ");
希望这会有所帮助。
【讨论】:
虽然这是 a 日志记录方法,但它几乎不能很好地替代 OP 正在使用和询问的适当的日志记录框架,例如 nlog。【参考方案3】:如果您使用的是 x64 版本的 Windows,则日志文件保存在 C:\Windows\SysWOW64 文件夹中
如果您使用 AnyCPU 配置构建项目并部署到 64 位操作系统,这是默认情况。
【讨论】:
【参考方案4】:在为我的服务创建安装项目并多次安装后,我终于意识到我没有将 NLog.config 文件作为要安装的文件之一包含在内。现在它与可执行文件一起包含,它运行良好。
不管怎样,NLog.config 文件可以事后手动添加,但服务可能需要停止并重新启动。
【讨论】:
【参考方案5】:当我遇到同样的问题时,我发现这篇文章很有帮助:
http://nlog-forum.1685105.n2.nabble.com/Nlog-not-working-with-Windows-service-tp6711077p6825698.html
基本上,您需要在配置中包含 $basedir 作为文件位置的一部分。这将使 NLog 从您的可执行文件的运行位置开始。
【讨论】:
【参考方案6】:这可能是您的服务在其他用户上下文下运行,也可能是因为 Windows 限制。我有同样的问题并解决它登录到以下文件夹:
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
也许这会对你有所帮助。
【讨论】:
【参考方案7】:我刚刚在企业框架日志记录方面遇到了同样的问题。
结束这个问题,其中的答案一起讲述了正确的故事。
在您使用 Visual Studio IDE 的示例中,正在使用应用程序的用户权限写入日志文件,并且正在写入日志文件。
Windows 服务没有这些相同的权限,因此不会写入日志文件。 Windows 服务确实有权(我已经对此进行了测试)写入
AppDomain.CurrentDomain.BaseDirectory
使用 System.IO 命名空间。
因此,将日志文件定向到此基本目录,您将是安全的。
【讨论】:
【参考方案8】:我也遇到过这个问题。正如 genki 所提到的,您可能正在登录到 \Windows\System32 目录。也许首先检查您期望在那里的日志文件。在编写服务时,我经常在开头放这样一行,让当前目录表现得像一个普通的应用程序
Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
【讨论】:
看起来不像在 system32 中 它不在系统 32 中,它在 SysWOW64 中$basedir
in nlog 表示AppDomain.CurrentDomain.BaseDirectory
,不是当前目录...【参考方案9】:
只是出于好奇,您是否检查过您的 Windows 安装的 system32 目录中是否有任何内容? Iirc,这是服务的默认应用程序运行时基目录...
【讨论】:
【参考方案10】:您可以使用Process Monitor 查看正在执行的文件操作,以及它们失败的原因。
我怀疑(与其他回答者一起)这是一个权限问题,服务帐户没有足够的文件访问权限。
【讨论】:
感谢 Richard 的提示,这让我意识到 nlog.config 文件不存在。加载它但仍然无法正常工作,但我确定这是问题的一部分【参考方案11】:您是否尝试过以不同的命名用户身份安装/运行您的服务。
如果可行,那么您可以确定存在权限问题,您的本地系统帐户无权写入目录/文件。
【讨论】:
【参考方案12】:您的本地服务帐户无权写入指定的文件位置。您可以在服务属性对话框的“登录”选项卡中将其设置为使用系统帐户,或者您可以在设置过程中设置用户帐户。
【讨论】:
或者只是在安装程序中授予本地服务写入该目录的权限。 如何在安装程序中授予权限? nlog.config 也在项目 bin 目录中,但没有移动到设置文件中。我怎样才能做到这一点以上是关于为啥我的 Windows 服务不会写入我的日志文件?的主要内容,如果未能解决你的问题,请参考以下文章
PHP error_log 方法不会将错误写入我的错误日志文件