您可以在代码中配置log4net而不是使用配置文件吗?

Mic*_*kus 129 .net c# logging log4net

我理解为什么log4net使用app.config文件来设置日志记录 - 这样您就可以轻松更改信息的记录方式,而无需重新编译代码.但在我的情况下,我不想app.config用我的可执行文件打包文件.我不想修改我的日志记录设置.

有没有办法让我设置登录代码而不是使用app.config

这是我的简单配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Logs\EventLog.txt" />
      <appendToFile value="false" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="1GB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
    <appender name="MemoryAppender" type="log4net.Appender.MemoryAppender">
    </appender>
    <root>
      <level value="Info" />
      <appender-ref ref="RollingLogFileAppender" />
      <appender-ref ref="MemoryAppender" />
    </root>
  </log4net>
</configuration>
Run Code Online (Sandbox Code Playgroud)

编辑:

要完全清楚:我的目标是没有XML文件.甚至不是我变成流的嵌入式资源.我的目标是完全以编程方式定义记录器.只是好奇是否有可能,如果是这样,我可能会找到一个语法示例.

Phi*_*p M 211

最终解决方案:1

对于任何可能在未来偶然发现这一点的人来说,这就是我所做的.我在下面制作了静态类:

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

namespace Spectrum.Logging
{
    public class Logger
    {
        public static void Setup()
        {
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

            PatternLayout patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
            patternLayout.ActivateOptions();

            RollingFileAppender roller = new RollingFileAppender();
            roller.AppendToFile = false;
            roller.File = @"Logs\EventLog.txt";
            roller.Layout = patternLayout;
            roller.MaxSizeRollBackups = 5;
            roller.MaximumFileSize = "1GB";
            roller.RollingStyle = RollingFileAppender.RollingMode.Size;
            roller.StaticLogFileName = true;            
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);

            MemoryAppender memory = new MemoryAppender();
            memory.ActivateOptions();
            hierarchy.Root.AddAppender(memory);

            hierarchy.Root.Level = Level.Info;
            hierarchy.Configured = true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我所要做的就是用以下调用替换我调用XML文件的代码:

//XmlConfigurator.Configure(new FileInfo("app.config")); // Not needed anymore
Logger.Setup();
Run Code Online (Sandbox Code Playgroud)

1 (这个答案被OP编辑成问题,我冒昧地把它作为社区答案,看这里为什么)

  • 从所有这一切,我如何获得ILog? (3认同)
  • 除非我调用`BasicConfigurator.Configure(hierarchy);`而不是仅设置`hierarchy.Configured = true;`,否则对我不起作用. (3认同)
  • 如果你在roller.File字符串中使用变量,只需注意你可以使用log4net.Util.PatternString类来格式化它,然后将结果分配给foller.File. (2认同)
  • 我最终使用此方法获得了重复的日志条目。我通过添加“hierarchy.Root.RemoveAllAppenders();”解决了这个问题 到Setup() 的开头。 (2认同)
  • 确保您希望写入日志文件的过程在您想要将日志文件写入的文件夹中具有写入权限。为了诊断log4net问题,在调用任何其他log4net之前添加`log4net.Util.LogLog.InternalDebugging = true;`,然后在调试器下运行并检查输出。log4net会告诉您哪里出了问题。 (2认同)

ole*_*sii 12

您也可以完全转义XML,我在这里编写了一个带有最少编程配置的示例.

简而言之,这就是您所需要的

var tracer = new TraceAppender();
var hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.AddAppender(tracer);
var patternLayout = new PatternLayout {ConversionPattern = "%m%n"};
patternLayout.ActivateOptions();
tracer.Layout = patternLayout;
hierarchy.Configured = true;
Run Code Online (Sandbox Code Playgroud)

  • 什么是Hierarchy类? (5认同)

Joe*_*Joe 11

是的,您可以通过调用以下命令配置log4net:

log4net.Config.XmlConfigurator.Configure(XmlElement element)
Run Code Online (Sandbox Code Playgroud)

请参阅log4net文档.


小智 5

或者,您可以创建一个继承自 log4net.Config.ConfiguratorAttribute 的自定义属性,并在其中对您的配置进行硬编码:

using log4net.Appender;
using log4net.Config;
using log4net.Core;
using log4net.Layout;
using log4net.Repository;
using log4net.Repository.Hierarchy;
using System;
using System.Reflection;

namespace ConsoleApplication1
{
    [AttributeUsage(AttributeTargets.Assembly)]
    public class MyConfiguratorAttribute : ConfiguratorAttribute
    {
        public MyConfiguratorAttribute()
            : base(0)
        {
        }

        public override void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository)
        {
            var hierarchy = (Hierarchy)targetRepository;
            var patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
            patternLayout.ActivateOptions();

            var roller = new RollingFileAppender();
            roller.AppendToFile = false;
            roller.File = @"Logs\EventLog.txt";
            roller.Layout = patternLayout;
            roller.MaxSizeRollBackups = 5;
            roller.MaximumFileSize = "1GB";
            roller.RollingStyle = RollingFileAppender.RollingMode.Size;
            roller.StaticLogFileName = true;
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);

            hierarchy.Root.Level = Level.Info;
            hierarchy.Configured = true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将以下内容添加到 .cs 文件中:

[assembly: ConsoleApplication1.MyConfigurator]
Run Code Online (Sandbox Code Playgroud)