【问题标题】:log4net - Appenders not working in IIS7.5log4net - 附加程序在 IIS7.5 中不起作用
【发布时间】:2010-06-25 23:00:58
【问题描述】:

我可以使用 log4net 和 Cassini/IIS 开发服务器写入日志文件,但是当我使用 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 运行。有 里面发生了很多事情,ELMAH,输出缓存,AJAX 控制工具包,表单身份验证,ssl,url 重写等......除了将每个都添加到测试应用程序中,有没有更好的方法来找出导致 log4net 的原因上班?

更新:

我使用 AdoNetAppender 来避免文件权限问题,并且仍然得到相同的结果。 AdoNetAppender 适用于在 Cassini 和 IIS 上运行的测试应用程序,但不适用于我的 Web 应用程序。得到以下异常:

System.Security.SecurityException:请求“System.Configuration.ConfigurationPermission, System.Configuration...”类型的权限失败。

更新 2: 我误认为测试 webapp fileAppender 在 IIS7.5 中工作。这就是发生的情况:测试 webapp fileAppender 和 AdoDotNetAppender 都可以在 Cassini/IIS 开发中工作,但不能在 IIS7.5 中工作。所以我认为问题出在 IIS 上,而不是我的 webapp。

注意。我以管理员身份运行 VS2008,但以非管理员身份登录 Windows 7。另外,我运行的是 Windows 7 家庭高级版,而不是专业版。

我授予 NETWORK SERVICE 对 Web 根目录的完全权限,但仍然没有创建文件。还给了每个人完全的权限,没有文件。

由于 adoDotNetAppender 也不起作用(但在开发 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 部分,但仍然静默失败。

我为任何可以帮助我让 AdoNetAppender 与 IIS7.5 一起工作的人增加了奖励。

更新 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 无法识别其中的一部分。

【问题讨论】:

  • 您是否尝试过提升应用程序的信任级别?你能发布完整的堆栈跟踪吗?

标签: visual-studio-2008 iis windows-7 asp.net-3.5 log4net


【解决方案1】:

您可以通过将密钥 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 开发。从 IIS7 运行时,甚至不会创建日志文件。我在更新中详细说明了。
【解决方案2】:

我终于让它工作了,我补充说

<trust level="Full" />

到 system.web。

对于中,AdoNetAppender 停止工作,但 FileAppender 仍然适用于中和高。

【解决方案3】:

使用进程监视器等工具监视 IIS 进程。我怀疑它试图在 IIS 帐户无权访问的目录中创建日志文件。

从该测试开始,指定您知道 IIS 进程可以访问的日志文件的绝对路径。

【讨论】:

  • 我一直在调查。谁真正拥有这个过程有点模糊。它不是 NETWORKSERVICE 并且仍在试图确定谁拥有 AppPoolIdentity 进程。我确实让每个人都可以访问日志目录,但这没有用。下载 systernals 并查看 IIS 权限。
  • 您是否对代码进行了足够的检测以查看它在哪里崩溃?将 OutputDebugStringAppender 和 DebugView 与(Capture -> Global Win32 勾选)一起使用。这应该是帮助解决主要问题的最轻松的日志方法。
  • 我似乎无法在 w3wp.exe 的进程监视器中找到文件写入请求。根据进程监视器,用户是 IIS APPPOOL\DefaultAppPool。我在新的更新中添加了更多细节。现在查看 DebugView。
  • 我添加了 OutputDebugStringAppender,运行 DebugView(以管理员身份)并勾选了全局并打开了 web pg,但 DebugView 中没有显示任何内容。
【解决方案4】:

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

【讨论】:

  • 是的,我将所有内容都交给了 NETWORK SERVICE 和 EVERYONE,但仍然没有创建文件。
【解决方案5】:

我遇到了同样的问题。我通过更改 IIS 7 配置解决了这个问题。比较简单...

转到应用程序池高级设置并将“加载用户配置文件”设置为 true!然后确保 IUSR(IIS 用户)有权写入日志路径。

此外,我通常会添加对 32 位应用程序的支持,这在您下载和使用来自 3rd 方的程序集时很有用,您不知道它们是针对 32 位、64 位还是独立的。

我通过阅读这篇文章发现了这一点:http://learn.iis.net/page.aspx/624/application-pool-identities/

最好的问候, 蒂亚戈。

【讨论】:

    【解决方案6】:

    尝试授予 IIS AppPool\DefaultAppPool 用户对日志目录的完全权限。这至少帮助了我一次。

    【讨论】:

      【解决方案7】:

      向这些 iis 用户授予全部权利。

      1. IUSR
      2. IIS_IUSR (PC_Name/IIS_IUSRS)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多