在IIS7上部署时,log4net不会创建日志文件

Sou*_*ane 8 asp.net log4net iis-7

大家早上好,

我有一个log4net问题,当我在本地计算机上进行开发时,该问题不存在,但是一旦我将应用程序部署到服务器,log4net就停止了工作.

这是服务器配置:-Windows XP SP3 -IIS 7 -framework .Net v4

这是网站web.config中的log4net配置:

<configuration>
      <log4net>
        <root>
          <level value="DEBUG" />
          <appender-ref ref="LogFileAppender" />
        </root>
        <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
          <param name="File" value="log.txt" />
          <param name="AppendToFile" value="true" />
          <rollingStyle value="Size" />
          <maxSizeRollBackups value="10" />
          <maximumFileSize value="30MB" />
          <staticLogFileName value="false" />
          <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
          </layout>
        </appender>
      </log4net>
    </configuration>
Run Code Online (Sandbox Code Playgroud)

我还有一个类库,这是它的App.config文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
  </configSections>
  <log4net>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="LogFileAppender" />
    </root>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
      <param name="File" value="log.txt" />
      <param name="AppendToFile" value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="30MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
      </layout>
    </appender>
  </log4net>
</configuration>
Run Code Online (Sandbox Code Playgroud)

这就是我在每个类上调用log函数的方法:

private static readonly ILog log = LogManager.GetLogger(typeof(AppDomain));
Run Code Online (Sandbox Code Playgroud)

......这就是我所说的:

log.Error("\n\t=>" + ex.GetBaseException().Message + "\n\r" + " @ " + Environment.StackTrace);
Run Code Online (Sandbox Code Playgroud)

Nei*_*den 14

可能是您没有权限写入'log.txt'文件.

我不知道当前目录是什么,但它不太可能是IIS可以写入的地方.

您需要在某处创建一个文件夹并授予IIS写入权限,我知道您需要授予对IIS_IUSRS组的访问权限,然后指定该文件的绝对路径.例如

<param name="File" value="D:\Logs\log.txt" />
Run Code Online (Sandbox Code Playgroud)

..使用您首选位置的路径.


Col*_*e W 9

在编写日志文件时,我倾向于不尝试将我的日志文件写入程序文件目录中的任何位置或任何虚拟目录中的任何内容,只是因为之前我遇到过安全问题.目前我正在使用以下所有log4net日志文件:

<file type="log4net.Util.PatternString" value="${ALLUSERSPROFILE}/<Product Name>/Logs/<Program Name>/<Program Name>.log" />
Run Code Online (Sandbox Code Playgroud)

${ALLUSERSPROFILE}是上面的关键.此目录通常没有作为虚拟目录和程序文件目录的安全限制.我发现自从我使用这条路以来,我没有遇到任何麻烦.

这个envrionment变量将您带到ProgramDataWindows Vista,7,8,Server 2008等目录中.我认为XP会将您带到另一个地方,但仍然是一个具有宽松权限的目录.

请注意上面的日志声明:

log.Error("\n\t=>" + ex.GetBaseException().Message + "\n\r" + " @ " + Environment.StackTrace);
Run Code Online (Sandbox Code Playgroud)

可以缩短为:log.Error(ex);除非格式化是必须的.但是如果你这样编写它并使用pdbs部署二进制文件,那么你记录的异常将包含完整的堆栈跟踪和发生错误的行号.

编辑:

如果log4net配置无效,日志文件也将无法创建.如果您确定您对log4net配置中指定的文件夹具有写访问权限,我建议debug="true"您首先在log4net配置部分设置启用log4net调试:

<log4net debug="true">
    ...
</log4net>
Run Code Online (Sandbox Code Playgroud)

设置上述调试标志将告诉log4net通过Windows跟踪侦听器输出所有日志.要捕获此跟踪侦听器输出,您必须在app.config中添加如下所示的部分:

<system.diagnostics>
  <trace autoflush="true">
    <listeners>
      <add 
        name="textWriterTraceListener" 
        type="System.Diagnostics.TextWriterTraceListener" 
        initializeData="C:\tmp\log4net.txt" />
    </listeners>
  </trace>
</system.diagnostics>
Run Code Online (Sandbox Code Playgroud)

确保app.config中上述跟踪侦听器配置中指定的路径存在,并且您具有该文件夹的写入权限!