【问题标题】:Why isn't ConsoleAppender configured in app.config causing logs to write to the console?为什么 app.config 中没有配置 ConsoleAppender 导致日志写入控制台?
【发布时间】:2020-06-04 11:26:08
【问题描述】:

在 App.Config 中,我为我的控制台应用程序声明了一个配置部分:

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

并配置一个ConsoleAppender

<log4net>
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
    </layout>
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="ConsoleAppender" />
  </root>
</log4net>

我们还在日志实用程序类中声明了一个 RollingFile 附加程序,它是我们在应用启动时的标准代码库的一部分(不容易修改):

        _hierarchy = (Hierarchy)LogManager.GetRepository();
        _rollingFileAppender = new RollingFileAppender();            
        ... //_rollingFileppender options

        _rollingFileAppender.ActivateOptions();
        _hierarchy.Root.AddAppender(_rollingFileAppender);
        _hierarchy.Configured = true;

当我运行应用程序时,我看到日志条目按预期写入文件,但没有写入控制台。

当我在调试器中检查我的ILog 实例时,我在Logger.Appenders 中根本看不到任何附加程序,但我确实看到RollingFileAppender 实例是Root.Appenders 中的唯一元素。

log4net 是我习惯“它只是工作”的东西 - 配置 代码添加附加程序是否存在一些不兼容,或者我需要将 LogManager 获取到 look 在 app.config 中?

【问题讨论】:

  • 我在查看 blog.elmah.io/… 并没有看到任何明显的我遗漏的东西
  • 如果您评论添加滚动附加程序的代码,控制台是否有效?

标签: c# .net log4net


【解决方案1】:

你只是让我好奇,我决定玩一下。
第一个观察结果是:你是对的

经过一些谷歌我发现了这个this

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="ConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level [%thread] %logger{1} %username - %message%newline" />
      </layout>
      <mapping>
        <level value="WARN" />
        <foreColor value="Yellow, HighIntensity" />
      </mapping>
      <mapping>
        <level value="ERROR" />
        <foreColor value="Red, HighIntensity" />
      </mapping>
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="ConsoleAppender" />
    </root>
  </log4net>
  <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
</configuration>

设置

using log4net;
using log4net.Appender;
using log4net.Layout;
using log4net.Repository.Hierarchy;

namespace LoggerDemo
{
    public static class Program
    {
        private static readonly ILog Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        public static void Main(string[] args)
        {
            SetupFileAppender();
            SetupTraceAppender();
            Logger.Error("Error");
        }

        private static void SetupTraceAppender()
        {
            var patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
            patternLayout.ActivateOptions();

            var trace = new TraceAppender();
            trace.Layout = patternLayout;
            trace.ActivateOptions();
            var l = (Logger)Logger.Logger;
            l.AddAppender(trace);
        }

        private static void SetupFileAppender()
        {
            var patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
            patternLayout.ActivateOptions();

            var roller = new RollingFileAppender();
            roller.AppendToFile = true;
            roller.File = "Log.txt";
            roller.Layout = patternLayout;
            roller.MaxSizeRollBackups = 5;
            roller.RollingStyle = RollingFileAppender.RollingMode.Size;
            roller.StaticLogFileName = true;
            roller.ActivateOptions();
            var l = (Logger)Logger.Logger;
            l.AddAppender(roller);
        }
    }
}

最重要的

在您的 AssemblyInfo 中添加 [assembly: log4net.Config.XmlConfigurator(Watch = true)]

结果

【讨论】:

  • 所以这仅在您将行添加到 AssemblyInfo 后才对您有效?如果您测试添加我拥有的代码,两个附加程序都可以工作吗?我不知道我的问题是配置驱动的,还是程序化的附加程序搞砸了
  • 正确。似乎是附加程序的问题。如果您想要控制台输出,则必须修改 Assemblyinfo 以使事情正常进行。对于我们从未遇到过的任何其他附加程序(文件、注册表、SQL、第 3 方)
  • 不幸的是,这些都没有帮助 - 脚本化的附加程序永远不会与编码的附加程序一起工作。我不知道你是否在程序版本旁边测试过这个,你有 MCE 吗?
  • @Mr.Boy 修改了主代码。其他部分保持不变。 .net Framework 4.7.2 与最新的 Nuget 版本的 Log4Net 一起使用。在这里像魅力一样工作:/
【解决方案2】:

我在 google 上查看了有关 log4net 的信息,似乎很有趣。我查看了一些网站,然后 我猜这里的输出应该是 log4net.config 之类的东西?那个家伙显示按下它,在这​​里的属性中应该是“复制到输出目录”:“总是复制”。 也许您可以以某种方式使用它并将输出打印到控制台中。这是 google 中关于它的非常有用的信息,您可以点击 Here 阅读更多信息。 希望我能以某种方式帮助你:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2019-12-27
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    相关资源
    最近更新 更多