为什么这个web api需要一个本地web api调用日志?

问题描述:

我有两个几乎完全相同的web api服务,使用C#编程并安装在IIS 6.1上的相同Windows 2008服务器上。当我做网络API调用他们时,他们都工作得很好。我正在使用log4net进行日志记录。但是,其中一个并不总是记录。他们都有相同的确切log4net的配置,这是:为什么这个web api需要一个本地web api调用日志?

<log4net> 
<root> 
    <level value="DEBUG" /> 
    <appender-ref ref="RollingLogFileAppender" /> 
</root> 
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="C:\LOGS\SomeFolder\" /> 
    <appendToFile value="true" /> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    <preserveLogFileNameExtension value="true" /> 
    <rollingStyle value="Date" /> 
    <datePattern value="'WebApi.One.'yyyy-MM-dd'.log'" /> 
    <staticLogFileName value="false" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%-5level [%thread][%date{dd-MM-yy HH:mm:ss,fff}] %logger - %message%newline" /> 
    </layout> 
</appender> 
</log4net> 

在配置上的唯一区别是它有一个稍微不同的名字,让他们不要登录到完全相同的文件datePattern。

对于日志工作正常的web api,一旦web api调用进来,每天都会创建一个新的日志文件。对于日志似乎无法工作的web api,不会创建新的日志文件。 但是,如果我在与安装在同一台服务器上的浏览器进行web api调用,则会开始记录。日志记录开始后的那天继续正常(即使来自其他机器的web api调用)。但是第二天没有创建新文件。

我无法看到有什么区别。当然,肯定会有一些我没有想到的事情,这使得这两个web apis在日志记录方面的行为有所不同。请记住,这两个服务都可以正常工作,只是日志记录对其中一个服务不起作用。

有什么建议吗?

编辑1:
彼得的建议添加诊断后,我可以看到,访问路径被拒绝:

log4net的:错误无法创建追加程序[RollingLogFileAppender]类型[log4net的.Appender.RollingFileAppender。报告错误如下。 System.UnauthorizedAccessException:拒绝访问路径“C__LOGS_WebApi.One_”。 在System.IO .__ Error.WinIOError(的Int32的errorCode,字符串maybeFullPath) 在System.Threading.Mutex.MutexTryCodeHelper.MutexTryCode(对象的UserData) 在System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode代码,CleanupCode backoutCode,对象的UserData) 在System.Threading.Mutex.CreateMutexWithGuaranteedCleanup(布尔initiallyOwned,字符串名称,布尔& createdNew,SECURITY_ATTRIBUTES secAttrs) 在System.Threading.Mutex..ctor(布尔initiallyOwned,字符串名称,布尔& createdNew,MutexSecurity mutexSecurity) 在System.Threading.Mutex..ctor(布尔型开头,字符串名称) at log4net.Appender.RollingFileAppender.ActivateOptions() at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement) log4net:ERROR未找到名为[RollingLogFileAppender]的附加器。

但我不知道为什么。

编辑2:
我在这些*的答案核对解决方案:

,但仍然没有进展。

This看起来非常相似,但我可以看到没有解决方案(虽然也许有一个)。

编辑3:
文件夹权限:

Folder permissions

+1

更改存储日志文件的文件夹的权限,以便应用程序有权修改日志文件 – Nkosi

+0

@Nkosi组每个人都被允许执行所有操作。不应该覆盖它吗? – Halvard

+0

@Nkosi你说得对。每个人都似乎也覆盖此Windows服务器上的IIS_IUSRS(或者任何?)。无论如何,如果你想让赏金只是将你的评论作为答案,我会奖励你。 – Halvard

根据异常信息的过程中没有足够的权利写入日志文件的位置。

根据我处理IIS的经验,更改存储日志文件的文件夹的安全权限以便应用程序/进程有权修改日志文件。

要确认/解决启动问题,请给每个人完全控制文件夹并测试文件是否可以修改。

如果有效,那么您可以确认它是一个权限问题。

我通常在日志文件夹中存储我的日志和存档时,为IIS_IUSRS提供以下权限。

  • 修改

为了限制可能的攻击向量我尽量给过程尽可能少的权限根据需要来执行其功能。添加和删​​除权限,然后测试它仍然按照需要运行。

+0

谢谢。它在这样做后有效。虽然我仍然不明白为什么它从同一台服务器调用时记录(它应该不是仍然是IIS_IUSRS尝试登录?)。但是这对我来说现在不重要:) – Halvard

它看起来像一个安全问题,调试这应该启用调试log4net的:

<appSettings> 
    <add key="log4net.Internal.Debug" value="true"/> 
</appSettings> 

而且

<system.diagnostics> 
    <trace autoflush="true"> 
     <listeners> 
      <add 
       name="textWriterTraceListener" 
       type="System.Diagnostics.TextWriterTraceListener" 
       initializeData="C:\tmp\log4net.txt" /> 
     </listeners> 
    </trace> 
</system.diagnostics> 

在您的配置中。

这样你就可以看到文件创建失败的原因。

log4net faq

+0

+1用于系统诊断。我应该想到这一点。工作繁忙的一天,但会增加这个,看看错误是什么。可能是安全的,如果是的话,会给你对号。 – Halvard