我可以使用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中运行的测试网络应用程序并在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,但我作为nonAdmin登录到Windows 7。此外,我正在运行Windows 7 Home Premium,而非Professional。
我已将NETWORK SERVICE完全权限授予Web根目录,但仍未创建任何文件。还给了每个人完全许可,没有文件。
由于adoDotNetAppender不起作用(但在开发IIS中也没有),我认为除了文件权限之外可能还有其他问题。
更新3:
我让它在IIS7上运行FileAppender。如果我加上这个:
<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的人添加了奖励。
更新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无法识别它的一部分。
答案 0 :(得分:41)
您可以通过将密钥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。
答案 1 :(得分:5)
我终于得到了它,我补充说
<trust level="Full" />
到system.web。
对于中等版本,AdoNetAppender会停止工作,但FileAppender仍适用于中高版本。
答案 2 :(得分:2)
使用Process Monitor等工具监视IIS进程。我怀疑它正在尝试在IIS帐户无法访问的目录中创建日志文件。
从该测试开始,指定您知道IIS进程有权访问的日志文件的绝对路径。
答案 3 :(得分:2)
您是否进入Windows资源管理器并检查正确的用户(NETWORK SERVICE?)是否具有写入权限?
答案 4 :(得分:2)
我有同样的问题。我通过更改IIS 7配置解决了这个问题。相当容易......
转到应用程序池高级设置并将“加载用户配置文件”设置为true!然后确保IUSR(IIS用户)有权写入日志路径。
此外,通常,我添加了对32位应用程序的支持,当您从第三方下载和使用程序集时,这非常有用,您不知道它们是否符合32,64或独立。
我通过阅读这篇文章找到了这个:http://learn.iis.net/page.aspx/624/application-pool-identities/
祝你好运, 蒂亚戈。
答案 5 :(得分:0)
尝试将IIS AppPool \ DefaultAppPool用户的完全权限授予日志目录。这至少帮助了我一次。
答案 6 :(得分:0)
授予这些iis用户完整的权限。