【问题标题】:log4net doesn't create log file when deployed on IIS7log4net 在 IIS7 上部署时不会创建日志文件
【发布时间】:2013-01-31 09:55:04
【问题描述】:

大家早上好,

我有一个 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);

【问题讨论】:

    标签: asp.net iis-7 log4net


    【解决方案1】:

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

    我不知道当前目录是什么,但它不太可能是 IIS 可以写入的位置。

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

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

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

    【讨论】:

    • 我不知道你从哪里得到 value="D:\Logs\log.txt" ?但我试图给用户写权限,但也没有用!
    • 您必须选择一个文件夹和一个文件名,然后将该文件的路径放入该“值”属性中。
    • 我们可以在值中放置一个相对路径吗?
    【解决方案2】:

    在编写日志文件时,我倾向于不尝试将日志文件写入程序文件目录中的任何位置或任何虚拟目录中的任何内容,这仅仅是因为我之前遇到过安全问题。目前,我对所有 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); 除非格式化是必须的。但是,如果您这样编写并使用 pdbs 部署二进制文件,您记录的异常将包含完整的堆栈跟踪和发生错误的行号。

    编辑:

    如果您的 log4net 配置无效,日志文件也将无法创建。如果您确定您对 log4net 配置中指定的文件夹具有写入权限,我建议您通过首先在 log4net 配置部分中设置 debug="true" 来启用 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>
    

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

    【讨论】:

    • 感谢您的帮助,我尝试了您的建议,将值修改为: 但没用!我应该自己创建文件夹和日志文件吗?或 log4net 自动完成??
    • 它将创建它们。你去那个目录找他们了吗?您应该可以在 Windows 资源管理器中输入 %ALLUSERSPROFILE%/FBIntra。如果它不存在,那么您就没有调用 log4net 中的 Configure 方法。您还可以在 AssemblyInfo.cs 文件中使用类似以下内容:[assembly: log4net.Config.XmlConfigurator(Watch = true)]
    【解决方案3】:

    我自己也遇到了同样的问题,结果我忘记为配置文件设置“构建操作”。因此 log4net.config 文件没有被部署,这当然是让应用程序写入日志文件所需要的。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        参考 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>

        【讨论】:

          猜你喜欢
          • 2012-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多