.net 使用xml文件配置log4net

y1aodyip  于 2023-05-08  发布在  .NET
关注(0)|答案(3)|浏览(130)

我试着配置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)]

但现在没有记录,有人能解释一下吗?

xmakbtuz

xmakbtuz1#

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

ao218c7q

ao218c7q2#

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

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

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

368yc8dk

368yc8dk3#

我相信你在帖子中提到的文件是App.config文件的内容。App.config是WinForm应用、Console应用等多种C#项目模板的默认配置文件。因此,您应该考虑将其命名为App.config,而不是Log4Net.config
为了有一个完整的理解,让我们通过三种可能的方式配置log4net:
1.如果我们想使用我们应用的App.config文件来保存log4net的设置,那么我们需要在AssemblyInfo.cs文件中添加下面提到的声明到下面一行:

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

App.config将保存log4net设置如下:

<?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>

1.在某些情况下,我们可能希望使用专用文件来保存log4net的设置。我们可以将其命名为例如。log4net.configlog4net.xml。在创建这样一个专用的配置文件时,我们需要确保log4net是配置文件的 root 标签(参考文件片段):

<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)]

1.现在是最后一个用例。假设我们有一个自己的自定义xml文件。myCustomSettings.xml包含log4net设置。在这种情况下,log4net标签存在于自定义配置文件中,但它 * 不是 * 该文件的根标签(参考文件片段)

<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文件中的声明性配置。所以请确保你已经从那里删除了它:

//TODO: Remove it
 [assembly: log4net.Config.XmlConfigurator(Watch = true)]

相关问题