【问题标题】:Why does this web api need a local web api call to log?为什么这个 web api 需要本地 web api 调用才能记录?
【发布时间】:2017-10-28 10:39:55
【问题描述】:

我有两个用 C# 编写的几乎相同的 Web api 服务,并安装在 IIS 6.1 上的同一个 Windows 2008 Server 上。当我对它们进行 web 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,不会创建新的日志文件。 但是,如果我从安装它的同一服务器上的浏览器进行 Web api 调用,则会开始记录。在当天的日志记录开始后,它继续正常(即使来自其他机器的 web api 调用)。但是第二天没有创建新文件。

我看不出有什么区别。当然,一定有一些我没有想到的东西让这两个 web api 在日志记录方面表现不同。请记住,这两种服务都可以正常工作,只是日志记录不适用于其中之一。

有什么建议吗?

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

log4net:ERROR 无法创建类型为 [log4net.Appender.RollingFileAppender] 的 Appender [RollingLogFileAppender]。报告的错误如下。 System.UnauthorizedAccessException:对路径“C__LOGS_WebApi.One_”的访问被拒绝。 在 System.IO.__Error.WinIOError(Int32 错误代码,字符串可能全路径) 在 System.Threading.Mutex.MutexTryCodeHelper.MutexTryCode(对象 userData) 在 System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode 代码,CleanupCode backoutCode,对象 userData) 在 System.Threading.Mutex.CreateMutexWithGuaranteedCleanup(布尔最初拥有,字符串名称,布尔&createdNew,SECURITY_ATTRIBUTES secAttrs) 在 System.Threading.Mutex..ctor(Boolean initialOwned,字符串名称,Boolean& createdNew,MutexSecurity mutexSecurity) 在 System.Threading.Mutex..ctor(布尔最初拥有,字符串名称) 在 log4net.Appender.RollingFileAppender.ActivateOptions() 在 log4net.Repository.Hierarchy.XmlHierarchyConfigurator.ParseAppender(XmlElement appenderElement) log4net:ERROR Appender 未找到名为 [RollingLogFileAppender]。

我不知道为什么。

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

但还是没有进展。

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

编辑 3:
文件夹权限:

【问题讨论】:

  • 更改日志文件所在文件夹的权限,使应用程序有权修改日志文件
  • @Nkosi 该组每个人都可以做任何事情。不应该覆盖它吗?
  • @Nkosi 你是对的。每个人似乎都没有在这个 Windows Server 上覆盖 IIS_IUSRS(或者可能是任何一个?)。无论如何,如果您想要赏金,只需提出您的评论作为答案,我会奖励您。

标签: asp.net-web-api2 log4net


【解决方案1】:

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

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

要确认/排除故障,首先要让每个人都完全控制文件夹并测试文件是否可以修改。

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

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

  • 阅读
  • 修改

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

【讨论】:

  • 谢谢。这样做后它可以工作。虽然我仍然不明白为什么在从同一服务器调用时它会记录(它不应该仍然是 IIS_IUSRS 试图记录吗?)。但这对我现在并不重要:)
【解决方案2】:

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

【讨论】:

  • +1 用于系统诊断。我应该想到的。工作忙碌一天,但会添加这个,看看错误是什么。可能是安全性,如果是,会给你打勾。
猜你喜欢
  • 2020-02-15
  • 1970-01-01
  • 2017-09-22
  • 2013-09-23
  • 1970-01-01
  • 2021-05-19
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多