9

大家早上好,

当我在本地机器上开发时,我遇到了一个不存在的 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>

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

private static readonly ILog log = LogManager.GetLogger(typeof(AppDomain));

...这就是我所说的:

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

5 回答 5

15

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

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

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

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

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

于 2013-01-31T10:24:17.207 回答
10

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

<file type="log4net.Util.PatternString" value="${ALLUSERSPROFILE}/<Product Name>/Logs/<Program Name>/<Program Name>.log" />

${ALLUSERSPROFILE}是上面的关键。该目录通常没有虚拟目录和程序文件目录的安全限制。我发现自从我使用这条路径以来我没有遇到任何问题。

此环境变量将您带到ProgramDataWindows Vista、7、8、Server 2008 等中的目录。我认为 XP 将您带到不同的地方,但仍然是一个权限较宽松的目录。

在旁注您上面的日志语句:

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

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

编辑:

如果您的 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>

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

于 2013-01-31T13:08:01.387 回答
0

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

于 2013-10-24T11:18:28.930 回答
0

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

于 2015-04-22T12:05:35.790 回答
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>

于 2017-08-15T06:28:30.817 回答