【问题标题】:Log4Net Not Logging When Deployed部署时 Log4Net 不记录
【发布时间】:2019-09-03 22:36:33
【问题描述】:

使用版本1.2.11。日志记录在我的开发机器上工作,但在部署时不会创建目录或日志。

我试过了:

  • 为 IUSR、所有人、本地用户提供完整的目录访问权限。
  • 以本地管理员帐户运行应用程序池。
  • 使用内部调试作为Phil Haack describes here

每次更改后停止并启动应用程序池。

输出文件中没有产生任何内容。

我的 log4Net 配置如下。有什么想法可以尝试下一步吗?

<?xml version="1.0"?>
<log4net debug="true">
  <appender name="file" type="log4net.Appender.RollingFileAppender">
    <file value="..\Logging\log.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="1MB" />
    <threshold value="DEBUG" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
  </appender>
  <appender name="console" type="log4net.Appender.DebugAppender">
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n" />
    </layout>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="file" />
    <appender-ref ref="console" />
  </root>
</log4net>

【问题讨论】:

  • 是否创建了输出目录或文件?
  • 不,两者都没有创建。
  • 在代码中,您是否将 Log4Net 设置为使用 XML 配置?应该在某处使用XmlConfigurator 类。
  • 我忽略了添加,但奇怪的是日志记录仍然可以在我的开发机器上工作。如果没有这个,它在开发中工作,但在部署时需要它,这是否有意义?
  • 它可能隐藏在AssemblyInfo.cs 中。打包时你可能会切换AssemblyInfo.cs 吗?另外,我不确定为调试或发布而构建是否会影响它。

标签: c# .net log4net


【解决方案1】:

如果没有创建目录和文件,那么很可能是在运行时没有读取(因此使用)配置。

我总是忘记为连接配置的 Log4net 添加一行代码。此代码通常出现在应用程序的引导类中(例如,用于 ASP.NET 应用程序的 Global.asax)。

XmlConfigurator.Configure(new System.IO.FileInfo(configFile));  // configFile being the path to the file.

您可以将此属性添加到AssemblyInfo.cs 文件中,而不是上面的内联:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

无论哪种方式,这都会连接 log4net。更多信息请参见Manual Configuration section of the log4net docs

【讨论】:

  • 我不确定这如何解释他在开发环境中时能够登录。
  • 我用头撞墙了一会儿。我尝试使用 AssemblyInfo.cs 方法,该方法在我的本地开发盒上有效,但在服务器上无效。一旦我将行 XmlConfigurator.Configure(); 添加到 Global.asax.cs 文件中,它就起作用了!
  • 与@JebaDaHut 相同 - 它正在使用 AssemblyInfo.cs 行在我的开发机器上工作,但在部署时却没有。添加XmlConfigurator.ConfigureAndWatch(new FileInfo(....)) 后,它是否开始登录我的部署服务器。
【解决方案2】:

如果您使用的是 IIS,请确保正确的组对 Logs 文件夹具有修改权限(通常是 IIS_USERS)。

【讨论】:

  • 这解决了我的问题。但我只给了 IIS_USRS 读写权限(不执行)。
【解决方案3】:

对我来说听起来像是权限问题。我几乎总是使用不需要为应用程序启用任何特殊权限即可将日志文件写入其中的目录。

这是我通常使用 log4net 的方式:

<file type="log4net.Util.PatternString" value="${ALLUSERSPROFILE}/<Company Name>/Logs/<Program Name>/<Log file name>.txt" />

当然,您需要将上面的公司名称、程序名称和日志文件名称替换为实际值。

这将写入通常不限制访问的 ProgramData 文件夹。您可以在文件资源管理器中通过键入 %ProgramData% 或 %AllUsersProfile% 导航到此文件夹

我喜欢这种方法的另一点是它几乎适用于所有微软操作系统。 XP、Vista、7、8

【讨论】:

    【解决方案4】:

    你可能不知道你在哪里记录:

    <file value="..\Logging\log.txt" />
    

    Will 源自您的运行目录,即 iis 目录。您可以更好地使用完整路径,例如:

    <file value="c:\Logging\log.txt" />
    

    然后您可以授予对日志记录目录的正确访问权限。据我所知,Log4net 不会创建任何目录。所以你必须先创建 c:\logging 目录。

    【讨论】:

      【解决方案5】:

      在我将这些行放入 web.config 应用程序设置之前,没有一个答案对我有用:

      <add key="log4net.Config" value="Log.config" />
      <add key="log4net.Config.Watch" value="True" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-26
        • 2016-12-04
        相关资源
        最近更新 更多