在log4net的appender中设置日志名称

4
我有一个名为MyLogger的类,在其中使用了log4net。我该如何修改我的appender来将日志保存在特定的日志名称中(我想通过参数logName设置它)。
public void AddEntry(string source, string logName, string contextInfo, string message, EventLogEntryType eventType)
        {

             log4net.ILog Log = log4net.LogManager.GetLogger(source);

             Log.Error(String.Format("Context Info: {0}{1}{2}{3}", contextInfo, Environment.NewLine, Environment.NewLine, message));

        }

<log4net>
  <root>
    <priority value="ALL" />
     <appender-ref ref="EventLogAppender" />
  </root>

这是我的Appender。现在它以常见的日志类型Application进行写入。

  <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >

    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%logger (%property{myContext}) [%level]- %message%newline" />
    </layout>
  </appender>
</log4net>

logName是应用程序全局的,还是您希望在运行时能够更改它? - AJ.
我想在运行时更改它。 - user278618
2个回答

2
我认为你需要的是这个:

我认为你需要的是这个:

<param name="LogName" value="MyLog" />

这里可以找到更多信息 如果您像这样做,您可能需要查看此问题。 基本上这是关于注册应用程序以便事件日志知道它的内容。

编辑(通过代码进行配置):

没有测试过,但这应该能解决问题:

foreach (AppenderSkeleton appender in this.Logger.Repository.GetAppenders())
{
    var eventlogAppender = appender as EventLogAppender;
    if (eventlogAppender != null)
    {
        eventlogAppender.LogName = "MyLog";
        eventlogAppender.ActivateOptions();
        break;
    }
 }

你可以添加一些测试来验证只有一个EventLogAppender,但是可能没有必要这样做。

我想在运行时更改这个值。 - user278618
在进行更改后,我错过了ActivateOptions()函数调用。谢谢! - deadlydog

2

这个有效:

<param name="LogName" type="log4net.Util.PatternString" value="%property{LogName}" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接