【问题标题】:Log4Net doesn’t write log in release mode - Console ApplicationLog4Net 在发布模式下不写日志 - 控制台应用程序
【发布时间】:2018-06-28 09:05:11
【问题描述】:

我有一个控制台应用程序和一个包含 Log4Net 方法的类库。现在,当在调试模式下运行应用程序时,它会写入日志,但是当它在发布模式下构建时,它不会写入日志文件。解决方案是什么?示例代码和配置文件如下所示

我的开发环境是

  • Visual Studio 2013 和 .NET Framework 4.5

控制台应用程序

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            log4net.GlobalContext.Properties["LogFileName"] = "TestLogin.txt";
            Logger log = new Logger(typeof(Program));
            log.Info("Logging is enabled!!");
        }
    }
}

控制台应用程序中的 App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <log4net>
      <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
        <file type="log4net.Util.PatternString" value ="%property{LogFileName}"/> 
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %level  - %message%newline%exception" />
        </layout>
      </appender>
      <root>
        <level value="ALL" />
        <appender-ref ref="RollingFileAppender" />
      </root>
    </log4net>
</configuration>

类库

using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Logging
{
    public class Logger
    {
        private readonly ILog log = null;

        public Logger(Type type)
        {
            log = LogManager.GetLogger(type);
        }
        public void Info(object message)
        {
            log.Info(message);
        }
    }
}

我关注了这个帖子,但它没有帮助我弄清楚为什么 Log4Net 在发布模式下不写入日志文件?

log4net doesn't log when running a .Net 4.0 Windows application built in Release mode

【问题讨论】:

标签: c# .net log4net


【解决方案1】:

有一些解决方法。

  • 您可以添加[MethodImpl(MethodImplOptions.NoInlining)] 属性到类库中的 Logger 构造方法。

  • 您可以在控制台项目(不是类库项目)中将[assembly: log4net.Config.XmlConfigurator(Watch = true)] 添加到 AssemblyInfo.cs

  • 您可以在 Logger 构造函数的开始。

我认为发生这种情况的原因是在发布模式下,您的类库是内联的,因此当 log4net 尝试查找该属性时,它认为调用程序集是您的不包含该属性的 exe。

PS。

我想你知道你的 Logger 类意味着你失去了按方法名过滤的能力,因为 log4net 只会看到 Logger.Info 方法名。

【讨论】:

  • 在发布此问题之前,我尝试了最后两个选项。我尝试了第一个选项,不幸的是它不起作用。
  • 最奇怪的。我尝试了所有三个选项,它们都有效。 (没有它们,在发布模式下不会发生日志记录)。您确定配置文件在您的发布文件夹中并且正确吗?
  • 非常感谢sgmoore!!!我总是检查 Debug 文件夹而不是 release 文件夹。我的错!!!是的,它以发布模式登录。我不必做任何事情。我上面列出的代码本身就可以工作,因此不需要额外的步骤来使其工作。您唯一需要做的就是检查发布文件夹。
  • 我想投票,但它需要 15 个声望点,而我只有 9 个点:(
  • 有一点需要说明。如果您通过 Visual Studio 运行上述代码,则会在发布模式下创建日志,但如果您转到发布文件夹,然后单击 ConsoleApplication1.exe,您将看到没有创建任何日志。要解决此问题,请遵循 sgmoore 建议的解决方法之一。我跟着第二个在 Logger 的构造函数中添加这行代码 log4net.Config.XmlConfigurator.Configure() 。现在构建解决方案并转到发布文件夹并再次单击 ConsoleApplication1.exe,您会看到该日志已创建。
【解决方案2】:

应该将[assembly: log4net.Config.XmlConfigurator(Watch = true)] 行添加到Properties 文件夹中的AssemblyInfo.cs 文件中。

【讨论】:

  • 你在发布模式下试过了吗?这是一个很好的代码,您应该能够快速运行它而无需大惊小怪。在我发布这个之前我已经尝试过了。它没有用。我又试了,还是不行。
  • 这是我的 AssemblyInfo.cs [程序集:log4net.Config.XmlConfigurator(Watch = true)] [程序集:AssemblyTitle("Logging")] [程序集:AssemblyDescription("")]
  • 我有类似的代码,只是我使用private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);而不是创建Logger类等
  • 好吧,我确实有一个单独的班级,不幸的是这就是要求。
【解决方案3】:

对于具有 MVC 应用程序的用户,该应用程序在 AssemblyInfo.cs 中已具有 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 行和 Global.asax.cs 中的 log4net.Config.XmlConfigurator.Configure(); 行,但仍无法写入,请确保应用程序池用户具有写入权限您正在写入日志的位置。

为了解决这个问题,我只是在不在 inetpub 内的 IIS 服务器上创建了一个日志目录,并为其提供了足够的权限(我想它可以是“所有人”、“完全控制”,如果它只是一个子日志目录和你感觉很懒),并在 log4net.config(或 Web.config,如果你没有隔离它)中写了完整的路径。

这是我的配置文件:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <root>
      <level value="ALL"/>
      <appender-ref ref="RollingFileAppender"/>
    </root>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="C:/absolute/path/to/logfile.log" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maximumFileSize value="10MB"/>
      <datePattern value="yyyyMMdd'-FULL.log'" />
      <maxSizeRollBackups value="-1"/>
      <staticLogFileName value="false"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
  </log4net>
</configuration>

【讨论】:

    【解决方案4】:

    确保 log4net.config 文件已添加到您的最终发布二进制文件中,并且与 ConfigFile = "log4Net.config" 中提到的路径相对应。

    我遇到了同样的问题,然后我意识到我只是在我的发布二进制文件中丢失了这个配置文件。

    【讨论】:

      【解决方案5】:

      我的 Logging.dll 和 Program.exe assembly.cs 中有这个。然后它可以在调试和发布模式下工作。我的程序是 Windows 服务。

      [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-17
        • 2022-09-26
        • 2017-05-26
        • 2019-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多