NLog不会写入文件名包含点的目标文件

时间:2013-04-17 04:53:21

标签: logging windows-services windows-server-2008-r2 nlog

使用“NT AUTHORITY \ NETWORK SERVICE”凭据启动Windows服务时,我遇到了NLog的一个奇怪问题:如果文件名包含点,它根本不会将任何内容记录到文件目标。

我在启用了.NET Framework 3.5 SP1功能的WinServer 2008 R2 Standard上运行Windows服务,NLog.config如下:

<targets>
  <target xsi:type="File"
    name="f" 
    fileName="${basedir}/logs/${shortdate}.txt"
    encoding="utf-8"
    concurrentWrites="true"
    keepFileOpen="false"
    layout="${longdate} ${uppercase:${level}} ${message}"/>
</targets>
<rules>
  <logger name="*" minlevel="Trace" writeTo="f" />
</rules>

经过一些谷歌搜索和试验配置后,我提出了一个解决方法,不在fileName参数中包含文件扩展名,它工作得很好,这解决了问题,但看起来不是一个像样的解决方案。

是什么让这个问题看起来更像是一个奇怪的魔术对我来说,事实上我设法解决了我的第二个Windows服务的配置中的日志文件扩展问题(它在相同的机器上运行,具有相同的credenials )只需更改项目选项中的装配信息即可。

有什么想法吗?

2 个答案:

答案 0 :(得分:13)

启用NLog的内部日志文件

<nlog 
  internalLogFile="c:\temp\nlogproblems.txt"  
  throwExceptions="true"  
  xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

我设法抓住了UnathorizedAccessException

2013-04-17 11:06:14.0445 Error Exception in asynchronous handler 
  NLog.NLogRuntimeException: Exception occurred in NLog --->
  System.UnauthorizedAccessException: Access is denied. 
  (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

得出的结论是我应该修复logs文件夹权限。

最后没有更奇怪的魔法,我只需要允许NETWORK SERVICE写入logs文件夹。

答案 1 :(得分:0)

就我而言,是运行应用程序池的用户。

似乎在某些情况下你需要特定的用户,我的情况是运行一个IHttpHandler并且有其他的方法我是从ProcessRequest调用的,并且出于某种原因从ProcessRequest本身它工作正常但是从我得到的子方法

Exception in asynchronous handler 
  NLog.NLogRuntimeException: Exception occurred in NLog --->
  System.UnauthorizedAccessException: Access is denied. 
  (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

在阅读了7kun的答案后,我给了Everyone完全控制并且它有效,然后改为找到真正的缺失用户