log4net在IIS7上部署时无法创建日志文件

11

大家早上好,

我在开发时没有遇到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>

我还有一个类库,这是它的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>

这是我在每个类中调用日志函数的方法:
private static readonly ILog log = LogManager.GetLogger(typeof(AppDomain));

...这就是我称之为的方法:

log.Error("\n\t=>" + ex.GetBaseException().Message + "\n\r" + " @ " + Environment.StackTrace);
5个回答

15

可能是因为您没有写入文件“log.txt”的权限。

我不知道当前目录在哪里,但不太可能是IIS可以写入的地方。

您需要在某个位置创建一个文件夹,并授予IIS写入该文件夹的访问权限。我了解您需要授予IIS_IUSRS组访问权限,然后指定该文件的绝对路径。例如:

<param name="File" value="D:\Logs\log.txt" />

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


我不知道你从哪里得到了value="D:\Logs\log.txt"的值?但是我尝试给用户写入权限,但也没有起作用! - Soufiaane
你需要选择一个文件夹和一个文件名,然后将该文件的路径放入'value'属性中。 - Neil Trodden
我们可以在值中放置相对路径吗? - Soufiaane

10

当涉及编写日志文件时,我通常不会尝试将我的日志文件写入程序文件目录或任何虚拟目录中,这是因为我之前遇到的安全问题。目前,我使用以下类似于以下内容来为所有的log4net日志文件编写日志:

<file type="log4net.Util.PatternString" value="${ALLUSERSPROFILE}/<Product Name>/Logs/<Program Name>/<Program Name>.log" />
${ALLUSERSPROFILE} 是上面的关键字。这个目录通常没有虚拟目录和程序文件目录的安全限制。我发现自从我使用这个路径以来,我没有遇到任何麻烦。
在Windows Vista、7、8、Server 2008等系统中,此环境变量将带您到ProgramData目录。我认为XP会带您到不同的地方,但仍然是一个权限较低的目录。
另外,你上面的日志语句:
log.Error("\n\t=>" + ex.GetBaseException().Message + "\n\r" + " @ " + Environment.StackTrace);

可以简化为:log.Error(ex);,除非必须格式化。但如果你这样编写并部署带有PDB的二进制文件,那么你记录的异常将包含完整的堆栈跟踪和错误发生的行号。
编辑:
如果你的log4net配置无效,日志文件也无法创建。如果你确定在log4net配置中指定的文件夹具有写入访问权限,建议首先通过将debug="true"设置为log4net配置段来启用log4net调试:
<log4net debug="true">
    ...
</log4net>

设置上述调试标志将告诉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>

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

谢谢您的帮助,我尝试了您的建议,将值修改为:<param name="File" value="${ALLUSERSPROFILE}/FBIntra/Logs/UI/FBIntra.log" />,但没有起作用!我应该自己创建文件夹和日志文件吗?还是log4net会自动创建? - Soufiaane
它会创建它们。你是否去那个目录找它们了?你应该能够在Windows资源管理器中输入%ALLUSERSPROFILE%/FBIntra。如果不在那里,那么你没有调用log4net中的Configure方法。你还可以在AssemblyInfo.cs文件中使用以下内容:[assembly: log4net.Config.XmlConfigurator(Watch = true)] - Cole W

1
我自己也遇到了同样的问题,后来发现我忘记为配置文件设置“生成操作(Build Action)”。因此,log4net.config文件没有被部署,这当然是必要的,以便应用程序能够写入日志文件。

0

日志文件夹目录应该被赋予IIS运行的权限。例如,如果IIS以网络服务运行,则将网络服务帐户添加到目录中并授予其完全权限。


0
请参考 web.config 中的以下配置。如果一切正常,请检查应用程序池所有者使用的 inetpub 子文件夹的写入权限。如果没有,请授予完全权限。
希望这能解决您的问题。

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

  <log4net debug="true">
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n %newline--%newline" />
      </layout>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
  </log4net>


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