【问题标题】:Configuring log4net with xml file使用 xml 文件配置 log4net
【发布时间】:2010-11-22 05:13:59
【问题描述】:

我尝试配置 log4net 以将所有内容记录到控制台输出。我有一个名为Log4Net.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.ConsoleAppender" >
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="INFO" />
      <appender-ref ref="ConsoleAppender" />
    </root>
  </log4net>
</configuration>

我有我的主课(只是一个测试用例)

namespace TestLog4Net {
    class Program {
        private static readonly ILog log = LogManager.GetLogger(typeof(Program));

        static void Main(string[] args) {
            log.Info("Info");
            log.Error("Error");
            Console.ReadKey();
        }
    }
}

我将这些行添加到AssemblyInfo.cs

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

但是现在什么都没有记录,有人可以解释一下吗?

【问题讨论】:

  • 我遇到了完全相同的问题。我有类似的实现,但我仍然无法解决问题。你能帮我修一下吗?
  • 确保 log4net.config 文件在属性中标记为“复制到输出”->“始终复制”。
  • 相关帖子 - Log4net xml output

标签: .net logging log4net


【解决方案1】:

当您在单独的配置文件中拥有 log4net 配置时,您不应包含配置和 configSections 元素。 log4net 应该是 xml 声明之后的顶级元素。

【讨论】:

    【解决方案2】:

    通过代码尝试此自定义配置。为我工作并在多个应用程序中进行了测试..

    string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "\\Config\\Log4Net.config");
        FileInfo finfo = new FileInfo(logFilePath);
       log4net.Config.XmlConfigurator.ConfigureAndWatch(finfo); 
    

    我知道这是一个很晚的回复。但对某些权利会有用。

    【讨论】:

      【解决方案3】:

      我相信,您在帖子中提到的文件是 App.config 文件的内容。它是各种 C# 桌面项目的默认配置文件,例如控制台应用程序。所以一共有三种情况:

      1. 如果您想使用app.config 文件来保存log4net 的设置,那么您必须将AssemlyInfo.cs 文件中的声明更改为:

        [程序集:log4net.Config.XmlConfigurator(Watch = true)]

      2. 如果您使用log4net 的专用设置文件,那么您必须修改您的Log4Net.config 或Log4Net.xml 文件,使log4net 是配置文件的根标记:

        <log4net>
             <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
               <layout type="log4net.Layout.PatternLayout">
                 <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
               </layout>
             </appender>
             <root>
               <level value="INFO" />
               <appender-ref ref="ConsoleAppender" />
             </root>
           </log4net>
        

        在这种情况下,您可以将您的声明保留在 AssemblyInfo.cs 文件中,就像您在帖子中提到的那样:

        [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
        
      3. 现在是最终的用例。假设您有一个自己的自定义 xml 文件,例如myCustomSettings.xml 其中包含 log4net setting。示例如下:

        <MyCustomSetting>
          <mySection1></mySection1>
          <mySection2></mySection2>
          <log4net>
             <root>
                 <level value="ALL" />
                 <appender-ref ref="file" />
                 <appender-ref ref="console" />
             </root>
             <appender name="console" type="log4net.Appender.ConsoleAppender">
               <layout type="log4net.Layout.PatternLayout">
                 <conversionPattern value="%date %level  - %message%newline" />
               </layout>
               <threshold value="Info" />
             </appender>
             <appender name="file" type="log4net.Appender.RollingFileAppender">
                <file value="${PROGRAMDATA}\MyProduct\myLogs.log" />
                <appendToFile value="true" />
                <rollingStyle value="Size" />
                <maxSizeRollBackups value="5" />
                <maximumFileSize value="10MB" />
                <staticLogFileName value="true" />
                <threshold value="Debug" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
                </layout>
             </appender>
           </log4net>
         </MyCustomSetting>
        

        在这种情况下,您必须在运行时通过 C# 代码配置 log4net。以下是你的做法:

         using System.Xml;
        
         var configFilePath = "myCustomSettings.xml";
         var log4netConfig = new XmlDocument();
         log4netConfig.Load(File.OpenRead(configFilePath));
        
         var repo = LogManager.CreateRepository(Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
        
         var log4NetXml = log4netConfig["MyCustomSetting"]["log4net"];
         log4net.Config.XmlConfigurator.Configure(repo, log4NetXml);
        

        在这种特殊情况下,请确保从 AssemblyInfo.cs 文件中删除声明性配置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        • 1970-01-01
        • 1970-01-01
        • 2015-07-21
        • 1970-01-01
        • 2011-05-18
        相关资源
        最近更新 更多