为什么此网站 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 答案中的解决方案:
- What am I doing wrong with thie log4net implementation?
- log4net: Error on loading custom appender
但还是没有进展。
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>
在您的配置中。
这样您就可以了解文件创建失败的原因。
根据异常消息,进程没有足够的权限写入日志文件的位置。
根据我处理 IIS 的经验,更改存储日志文件的文件夹的安全权限,以便 application/process 有权修改日志文件通常是可行的。
到 confirm/troubleshoot 首先让每个人都完全控制文件夹并测试文件是否可以修改。
如果可行,那么您可以确认这是一个权限问题。
我通常 IIS_IUSRS 对我存储日志和存档的日志文件夹授予以下权限。
- 阅读
- 写
- 修改
为了限制可能的攻击途径,我尝试授予该进程执行其功能所需的尽可能少的权限。添加和删除权限,然后测试它是否仍按预期运行。
我有两个几乎完全相同的 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 答案中的解决方案:
- What am I doing wrong with thie log4net implementation?
- log4net: Error on loading custom appender
但还是没有进展。
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>
在您的配置中。
这样您就可以了解文件创建失败的原因。
根据异常消息,进程没有足够的权限写入日志文件的位置。
根据我处理 IIS 的经验,更改存储日志文件的文件夹的安全权限,以便 application/process 有权修改日志文件通常是可行的。
到 confirm/troubleshoot 首先让每个人都完全控制文件夹并测试文件是否可以修改。
如果可行,那么您可以确认这是一个权限问题。
我通常 IIS_IUSRS 对我存储日志和存档的日志文件夹授予以下权限。
- 阅读
- 写
- 修改
为了限制可能的攻击途径,我尝试授予该进程执行其功能所需的尽可能少的权限。添加和删除权限,然后测试它是否仍按预期运行。