log4net - IIS7.5中的Appenders无法工作

15

我能够使用log4net和Cassini/IIS dev服务器写入日志文件,但当我使用IIS7.5时,无法将其写入到文件中。

最初,我遇到了安全异常,因此我添加了requirePermission="false",异常消失了,但没有创建文件。

根据IISM的说法,信任级别是完整的。

我无法在自己的机器上使其工作,我想知道当我转移到ISP(discountASP)会发生什么。

下面是log4net的设置:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"  />
</configSections>

<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <file value="log-file.txt" />
        <appendToFile value="true" />
        <encoding value="utf-8" />
        <layout type="log4net.Layout.SimpleLayout" />
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="FileAppender" />
    </root>
</log4net>

C#

log4net.Config.XmlConfigurator.Configure();
ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Log.Info("This is a test");
有什么线索吗?
ASP.NET 3.5, VS2008, Windows 7, IIS7.5, log4net 1.2.10
编辑:
我在Cassini中运行的测试Web应用程序,现在在IIS7.5上运行,并且它可以正常工作,因此有些特定于我的Web应用程序会阻止log4net正常运行。除了将每个部分添加到测试应用程序之外,有没有更好的方法来找出是什么导致log4net无法运行?
更新:
我使用AdoNetAppender避免文件权限问题,但仍然得到相同的结果。AdoNetAppender可在Cassini和IIS上运行的测试应用程序中工作,但不能在我的Web应用程序中工作。出现以下异常:
System.Security.SecurityException:请求类型为“System.Configuration.ConfigurationPermission,System.Configuration…”的权限失败。
更新2:
我错误地认为在IIS7.5中测试的Web应用程序fileAppender可以工作。情况是:测试Web应用程序的fileAppender和AdoDotNetAppender都可以在Cassini/IIS dev中工作,但是不能在IIS7.5中工作。因此,我认为问题在于IIS,而不是我的Web应用程序。
请注意。我将VS2008作为管理员运行,但未以管理员身份登录Windows 7。此外,我正在运行Windows 7 Home Premium而不是Professional。
我授予NETWORK SERVICE完全权限访问Web根目录,但仍未创建文件。也已将EVERYONE授予完全权限,但仍未创建文件。
由于adoDotNetAppender也无法工作(但在dev IIS中可以),因此我认为除了文件权限之外可能还存在其他问题。
更新3:
我已为IIS7上的FileAppender解决了问题。如果我添加以下内容:
<identity impersonate="true"
    userName="zzz"
    password="yyy" />

如果用户是管理员,则可以正常工作。如果是我这样不是管理员的用户,则无法工作。因此,这是一个权限问题。但是我之前已经将该目录的权限授予了所有人,并且仍然无法正常工作,所以肯定存在其他的权限设置。同时,虽然使用模拟用户后 FileAppender 能够工作,但 AdoNetAppender 在 IIS7 中仍然无法工作。我尝试添加:

<securityContext type="log4net.Util.WindowsSecurityContext">
    <userName value="zzz" />
    <password value="yyy" />
    <domain value="aaa" />
</securityContext>

我已将AdoNetAppender部分添加到配置文件中,但仍然无声失败。

我为任何能帮助我在IIS7.5上使AdoNetAppender工作的人添加了悬赏。

更新4:

我终于得到了堆栈跟踪。以下是它:

log4net:ERROR [AdoNetAppender] Failed in DoAppend
System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
       at log4net.Util.LogicalThreadContextProperties.GetProperties(Boolean create)
       at log4net.Core.LoggingEvent.CreateCompositeProperties()
       at log4net.Core.LoggingEvent.CacheProperties()
       at log4net.Core.LoggingEvent.FixVolatileData(FixFlags flags)
       at log4net.Core.LoggingEvent.set_Fix(FixFlags value)
       at log4net.Appender.BufferingAppenderSkeleton.Append(LoggingEvent loggingEvent)
       at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)
The action that failed was:
LinkDemand
The type of the first permission that failed was:
System.Security.Permissions.SecurityPermission
The Zone of the assembly that failed was:
MyComputer

我开启了SQL Profiler但没有任何数据传递到SQL Server。此外,SQL Server帐户具有执行插入操作所需的适当权限。同时,我删除了SecurityContext部分,因为log4net无法识别其中的一部分内容。


你尝试过提高应用程序的信任级别吗? 你能发布完整的堆栈跟踪吗? - Michael Baker
7个回答

44

您可以通过在应用程序配置文件中添加键log4net.Internal.Debug来启用log4net内部调试。

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

这将会把调试信息写入到控制台和System.Diagnostics.Trace系统中。之后你可以通过向配置文件添加跟踪侦听器来记录这些消息到文本文件中。请确保应用程序有权限写入该文件。

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

或者,跟踪消息也会写入系统调试器,因此您可以使用诸如DebugView之类的实用工具捕获这些消息。有关详细信息,请参阅log4Net FAQ


我已经尝试了上述方法,但只在Cassini/IIS Dev中有效。当从IIS7运行时,甚至没有创建日志文件。我在我的更新中进行了详细说明。 - Steve
你看过这篇帖子吗?https://dev59.com/QnE95IYBdhLWcg3wrP6w - Garett

5

我终于搞定了,我新增了一些内容

<trust level="Full" />

转到system.web。

使用Medium级别,AdoNetAppender停止工作,但FileAppender仍然适用于Medium和High级别。


这个安全吗?MSDN文档说,这个“授予ASP.NET应用程序访问任何受操作系统安全保护的资源的权限”。 - alex

2
使用类似 Process Monitor 的工具并跟踪 IIS 进程。我怀疑它正在尝试在 IIS 帐户无权访问的目录中创建日志文件。
继续测试,指定一个你知道 IIS 进程可以访问的日志文件的绝对路径。

我一直在研究这个问题。对于确切的流程所有者还有点模糊。它不是NETWORKSERVICE,仍在努力确定谁拥有AppPoolIdentity进程。我已经给了EVERYONE访问日志目录的权限,但没有起作用。正在下载Systernals并研究IIS权限。 - Steve
你的代码已经被仪器化到足够的程度来看它在哪里失败了吗? 使用OutputDebugStringAppender和DebugView(选中Capture-> Global Win32) 。这应该是最轻松无痛的日志记录方法,以帮助排除主要问题。 - Michael Baker
我在Process Monitor中找不到w3wp.exe的文件写入请求。根据进程监视器,用户是IIS APPPOOL\DefaultAppPool。我在新的更新中添加了更多细节。现在正在查看DebugView。 - Steve
我添加了OutputDebugStringAppender,以管理员身份运行了DebugView,并选中了全局并打开了网页,但在DebugView中没有显示任何内容。 - Steve

2

您是否进入Windows资源管理器并检查正确的用户(NETWORK SERVICE?)是否具有写入权限?


1
是的,我已经将所有权限都赋予了NETWORK SERVICE和EVERYONE,但仍然没有创建文件。 - Steve

2
我曾经遇到过同样的问题。我通过更改IIS 7配置来解决它。非常容易...
进入应用程序池高级设置,将“加载用户配置文件”设置为true!然后确保IUSR(IIS用户)有权限写入日志路径。
此外,通常情况下,我会添加对32位应用程序的支持,这在您从第三方下载和使用程序集时非常有用,因为您不知道它们是否编译为32位、64位或独立。
我通过阅读这篇文章找到了解决方法:http://learn.iis.net/page.aspx/624/application-pool-identities/ 最好的问候, Tiago.

0
尝试给IIS AppPool\DefaultAppPool用户在日志目录中赋予完全权限。这至少曾经帮助过我一次。

0

给这些 IIS 用户完全的权限。

  1. IUSR
  2. IIS_IUSR(PC_Name/IIS_IUSRS)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接