【问题标题】:log4net is not logging to log file or console (external log4net.config file)log4net 未记录到日志文件或控制台(外部 log4net.config 文件)
【发布时间】:2017-12-04 06:46:21
【问题描述】:

我在我的项目中创建了一个名为log4net.config的文件,并添加了以下配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
  <log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="console" />
      <appender-ref ref="RollingFileAppender" />
    </root>
    <appender name="console" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level %logger - %message%newline" />
      </layout>
    </appender>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="${LOCALAPPDATA}\MyApp\LogFile.log" />
      <param name="AppendToFile" value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5level [%d{yyyy-MM-dd hh:mm:ss}] [%thread] (Line:%line) %M: - %m%n" />
      </layout>
    </appender>
  </log4net>
</configuration>

之后,我将下面的行添加到我的AssemblyInfo.cs 文件中:

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

在应用程序中,我有以下静态类:

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


        public static void LogInfo(string msg)
        {
            log.Info(msg);
        }

        public static void LogDebug(string msg)
        {
            log.Debug(msg);
        }

        public static void LogWarn(string msg, Exception e)
        {
            log.Warn(msg, e);
        }

        public static void LogError(string msg, Exception e)
        {
            log.Error(msg, e);
        }
    }

然后我尝试使用Logger.LogDebug("Error logger working.");在另一个类的应用程序中的某个位置登录

但是,我看不到任何正在创建或写入的日志文件。我做错了什么?

更新:

我还在我的 app.config 文件中添加了以下内容,但我在输出控制台上什么也没看到...

<appSettings>
    <add key="log4net.Internal.Debug" value="true"/>
</appSettings>

【问题讨论】:

  • 消除 ACL 问题并将 ${LOCALAPPDATA}\... 更改为 C:\TEMP\LogFile.log 并检查是否有效。
  • @lloyd 在更改后仍然无法正常工作。
  • 可能会删除 log4net 并一次添加每个配置元素。
  • 我试过你的 log4net.config 文件,它工作正常。您确定将 log4net.config 文件复制到您的目标文件夹吗?另外为了启用 log4net 调试,我通常只需更改 log4net.config 文件,将 &lt;log4net&gt; 替换为 &lt;log4net debug="true"&gt;
  • Docs say ".. 值得注意的是属性纯粹是被动的。它们只是信息。因此,如果您使用配置属性,则必须调用 log4net 以允许它读取属性. 对 LogManager.GetLogger 的简单调用将导致调用程序集上的属性被读取和处理。因此,必须在应用程序启动期间尽早进行日志调用,当然在任何外部程序集已加载并调用。"

标签: c# logging log4net log4net-configuration


【解决方案1】:

如果您在 log4net 日志记录配置文件中有 log4net 配置,则不必添加 web.config 的配置(配置标记和部分)。只需添加 log4net 标签:

<log4net>
<root>
  <level value="ALL" />
  <appender-ref ref="console" />
  <appender-ref ref="RollingFileAppender" />
</root>
<appender name="console" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %level %logger - %message%newline" />
  </layout>
</appender>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <param name="File" value="${LOCALAPPDATA}\MyApp\LogFile.log" />
  <param name="AppendToFile" value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%-5level [%d{yyyy-MM-dd hh:mm:ss}] [%thread] (Line:%line) %M: - %m%n" />
  </layout>
</appender>
</log4net>

【讨论】:

  • 您不必必须添加配置,但如果这样做似乎不会造成任何问题。
【解决方案2】:

感谢 stuartd 的评论,设法找出问题所在。我的问题是,我的完整解决方案有 2 个项目。我只为 log4net 配置了一个项目(不是启动项目)。

我原来的 log4net 配置没有任何错误。我只是将 log4net 引用添加到我的启动项目中,并将 log4net 配置也添加到该项目中,然后它开始记录。

非常感谢所有测试我的配置的人。

【讨论】:

    【解决方案3】:

    我无法重现您的错误。在 AssemblyInfo 中配置 log4net 可以正常工作。可能是配置的问题。让我告诉你另一个实现

        private static readonly ILog log = LogManager.GetLogger("myLogger");
        private static string configFile = "log4net.config";
        static Logger()
        {
            XmlConfigurator.Configure(new FileInfo(configFile));
        }
    

    log4net.config:

    <log4net>
    <logger name="myLogger">
      <level value="ALL" />
      <appender-ref ref="console" />
      <appender-ref ref="RollingFileAppender" />
    </logger>
    <appender name="console" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level %logger - %message%newline" />
      </layout>
    </appender>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="${LOCALAPPDATA}\MyApp\LogFile.log" />
      <param name="AppendToFile" value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5level [%d{yyyy-MM-dd hh:mm:ss}] [%thread] (Line:%line) %M: - %m%n" />
      </layout>
    </appender>
    </log4net>
    

    【讨论】:

    • 这不是配置 log4net 的唯一方法,并且对于 OP 来说不是必需的,因为他正在使用 log4net 程序集属性(请参阅logging.apache.org/log4net/release/manual/…)。
    • @sgmoore 非常感谢您的评论,我错过了有关配置的作者消息
    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多