2010-06-25 120 views
15

我能够使用log4net和Cassini/IIS dev服务器写入日志文件,但是当我使用IIS7.5时,我无法写出文件。log4net - Appender不能在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

编辑:

我使用的测试Web应用程序,在卡西尼运行在IIS7运行它。 5,它的工作,所以有一些特定于我的Web应用程序,阻止log4net运行。有 不断在其中进行,ELMAH,输出缓存,AJAX控制工具包,形式认证,ssl,url重写等等...除了每个添加到测试应用程序,有没有更好的方法来找出什么是导致log4net正常工作?

UPDATE:

我用AdoNetAppender远离文件权限问题路程,我仍然得到同样的结果。 AdoNetAppender适用于在Cassini和IIS上运行的测试应用程序,但它不适用于我的Web应用程序。获得以下例外:

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

更新2: 我错了,测试的webapp fileAppender在IIS7.5工作。发生这种情况的原因是:测试webapp fileAppender和AdoDotNetAppender都在Cassini/IIS dev中工作,但不在IIS7.5中工作。所以我认为这是IIS的问题,而不是我的web应用程序。

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

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

由于adoDotNetAppender无法正常工作(但在开发IIS中),我认为除文件权限之外可能还有其他问题。

更新3:

我得到了它为FileAppender上IIS7工作。如果我加上:

<identity impersonate="true" 
    userName="zzz" 
    password="yyy" /> 

如果用户是管理员,它的工作原理。如果是我,不是管理员,它不是。所以这是一个权限问题。但是我确实授予了EVERYONE权限以前的文件所在的目录,并且它不起作用,所以在其他地方有权限设置。此外,虽然FileAppender现在可以与模拟一起使用,但AdoNetAppender stil不在IIS7中。我尝试添加:

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

到AdoNetAppender部分,但仍然无法安静失败。

我为任何能够帮助我获得AdoNetAppender与IIS7.5一起工作的人添加了一笔赏金。

UPDATE 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事件探查器和没有任何它使SQL Server。此外,SQL Server帐户具有执行插入的适当权限。另外,我删除了SecurityContext部分,因为log4net无法识别它的一部分。

+0

您是否尝试过提升应用程序的信任级别? 你能发布完整的堆栈跟踪吗? – 2010-06-27 06:01:27

回答

5

我终于得到了它的工作,我加入

<trust level="Full" /> 

到System.Web程序。

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

+0

安全吗? MSDN文档说这个“[授予ASP.NET应用程序访问受操作系统安全限制的资源的权限](https://msdn.microsoft.com/en-us/library/tkscy493%28v=vs。 85%29.aspx)” – alex 2015-04-27 16:52:51

2

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

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

+0

我一直在寻找。对于究竟谁拥有这个过程有点模糊。这不是NETWORKSERVICE,而是仍在试图确定谁拥有AppPoolIdentity进程。尽管我确实允许所有人访问日志目录,但这并不起作用。下载systernals并查看IIS权限。 – Steve 2010-06-26 14:46:02

+0

您是否已经安装了足够的代码以查看它的位置?使用OutputDebugStringAppender和DebugView(Capture - > Global Win32打勾)。这应该是最无痛的日志方法,以帮助解决主要问题。 – 2010-06-27 06:00:28

+0

我似乎无法在进程监视器中为w3wp.exe找到文件写入请求。根据进程监视器,用户是IIS APPPOOL \ DefaultAppPool。我在新的更新中添加了更多细节。现在查看DebugView。 – Steve 2010-06-27 13:26:57

40

您可以通过将密钥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

+0

我做了上述,它只适用于卡西尼/ IIS开发。从IIS7运行时,甚至不会创建日志文件。我详细阐述了我的更新。 – Steve 2010-06-27 13:24:39

+0

您是否看到这篇文章http://stackoverflow.com/questions/2205757/need-help-with-security-exception-in-asp-net-mvc-web-application – Garett 2010-06-27 16:19:51

+0

这是一个权限问题,我认为 - 请参阅我的更新。 – Steve 2010-06-28 15:43:35

2

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

+1

是的,我把所有的东西都给了网络服务和每个人,而且还没有创建文件。 – Steve 2010-06-27 13:25:09

2

我有同样的问题。我通过更改IIS 7配置来解决它。相当容易...

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

此外,我通常会添加对32位应用程序的支持,这在您从第三方下载和使用程序集时非常有用,您不知道它们是否为32,64或独立编译。 http://learn.iis.net/page.aspx/624/application-pool-identities/

最好的问候, 蒂亚戈:

我通过阅读这篇文章发现这一点。

0

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