为什么此网站 api 需要本地网站 api 调用才能登录?

Why does this web api need a local web api call to log?

我有两个几乎完全相同的 Web api 服务,它们是用 C# 编写的,并且安装在 IIS 6.1 上的同一个 Windows 2008 服务器上。当我对它们进行网络 api 调用时,它们都工作得很好。我正在使用 log4net 进行日志记录。然而,其中之一并不总是记录。它们都具有完全相同的 log4net 配置,即:

<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,日志记录似乎不起作用,因为未创建新的日志文件。 但是,如果我从安装它的同一服务器上的浏览器进行网络 api 调用,则会开始记录。当天的日志记录开始后,它继续正常(即使来自其他机器的网络 api 调用)。但是第二天没有创建新文件。

我看不出有什么区别。肯定有一些我没有想到的东西使这两个网络 api 在日志记录方面表现不同。请记住,这两项服务都可以正常工作,只是日志记录对其中一项不起作用。

有什么建议吗?

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

log4net:ERROR Could not create Appender [RollingLogFileAppender] of type [log4net.Appender.RollingFileAppender]. Reported error follows. System.UnauthorizedAccessException: Access to the path 'C__LOGS_WebApi.One_' is denied. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.Threading.Mutex.MutexTryCodeHelper.MutexTryCode(Object userData) at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) at System.Threading.Mutex.CreateMutexWithGuaranteedCleanup(Boolean initiallyOwned, String name, Boolean& createdNew, SECURITY_ATTRIBUTES secAttrs) at System.Threading.Mutex..ctor(Boolean initiallyOwned, String name, Boolean& createdNew, MutexSecurity mutexSecurity) at System.Threading.Mutex..ctor(Boolean initiallyOwned, String name) at log4net.Appender.RollingFileAppender.ActivateOptions() at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement) log4net:ERROR Appender named [RollingLogFileAppender] not found.

虽然我不知道为什么。

编辑 2:
我检查了这些 Whosebug 答案中的解决方案:

但还是没有进展。

This 看起来非常相似,但我看不到那里有解决方案(尽管也许有一个)。

编辑 3:
文件夹权限:

这看起来像是一个安全问题,要调试它,您应该为 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

根据异常消息,进程没有足够的权限写入日志文件的位置。

根据我处理 IIS 的经验,更改存储日志文件的文件夹的安全权限,以便 application/process 有权修改日志文件通常是可行的。

到 confirm/troubleshoot 首先让每个人都完全控制文件夹并测试文件是否可以修改。

如果可行,那么您可以确认这是一个权限问题。

我通常 IIS_IUSRS 对我存储日志和存档的日志文件夹授予以下权限。

  • 阅读
  • 修改

为了限制可能的攻击途径,我尝试授予该进程执行其功能所需的尽可能少的权限。添加和删​​除权限,然后测试它是否仍按预期运行。