Log4net (EventLogAppender)我们是否可以在运行时设置事件类别,而无需重新创建appender?

Log4net (EventLogAppender)我们是否可以在运行时设置事件类别,而无需重新创建appender?,log4net,log4net-appender,Log4net,Log4net Appender,这是一个基类,所以我完全在运行时配置EventLogAppender,如下所示: Public MustInherit Class EventLogger Public Sub Test(EventSource As String) Dim oAppender As IAppender oAppender = New EventLogAppender With DirectCast(oAppender, EventLogAppender) .Appli

这是一个基类,所以我完全在运行时配置EventLogAppender,如下所示:

Public MustInherit Class EventLogger
  Public Sub Test(EventSource As String)
    Dim oAppender As IAppender

    oAppender = New EventLogAppender

    With DirectCast(oAppender, EventLogAppender)
      .ApplicationName = EventSource
      .Category = 0 ' <========== Would like to set this value when logging 
      .EventId = 0
      .Layout = New PatternLayout("%level: {0} %message%newline".ToFormat(EventSource))
      .ActivateOptions()
    End With

    BasicConfigurator.Configure(oAppender)
    Me.Logger = LogManager.GetLogger(Me.GetType)
    Me.Logger.Info("Test")
  End Sub

  Private Logger As ILog
End Class

Public Module Extensions
  <Extension>
  Public Function ToFormat(Template As String, ParamArray Values As Object()) As String
    Return String.Format(Template, Values)
  End Function
End Module
Public必须继承类EventLogger
公共子测试(EventSource作为字符串)
昏昏欲睡
oAppender=新事件日志追加器
使用DirectCast(oAppender、EventLogAppender)
.ApplicationName=EventSource
.Category=0'好的,明白了。感谢您提供的解决方案。。。为每个类别添加一个
IAppender
,并相应地设置其过滤器。性能不会受到影响,因为这种情况只发生一次

以下是方法:

Public Class EvAppender
  Inherits EventLogAppender

  Private Sub New(ApplicationName As String, Category As Categories)
    Me.ApplicationName = ApplicationName
    Me.Category = Category
    Me.EventId = 0
    Me.Layout = New PatternLayout("Level: %level%newlineSource: %logger.%M()%newlineMessage: %message%newline%exception")
    Me.Name = "{0}Appender".ToFormat(Category.ToString)

    Me.AddMapping(Me.GetMapping(Level.Debug))
    Me.AddMapping(Me.GetMapping(Level.Info))
    Me.AddMapping(Me.GetMapping(Level.Warn))
    Me.AddMapping(Me.GetMapping(Level.Error))
    Me.AddMapping(Me.GetMapping(Level.Fatal))

    Me.AddFilter(New LevelRangeFilter With
                 {
                  .LevelMin = Me.LogLevel(Category),
                  .LevelMax = Me.LogLevel(Category)
                 })

    Me.ActivateOptions()
  End Sub



  Public Shared Function Build(ApplicationName As String) As List(Of EvAppender)
    Build = New List(Of EvAppender)
    Build.Add(New EvAppender(ApplicationName, Categories.Debug))
    Build.Add(New EvAppender(ApplicationName, Categories.Info))
    Build.Add(New EvAppender(ApplicationName, Categories.Warn))
    Build.Add(New EvAppender(ApplicationName, Categories.Error))
    Build.Add(New EvAppender(ApplicationName, Categories.Fatal))
  End Function



  Private Function GetMapping(LogLevel As Level) As EventLogAppender.Level2EventLogEntryType
    GetMapping = New EventLogAppender.Level2EventLogEntryType
    GetMapping.Level = LogLevel

    Select Case GetMapping.Level
      Case Level.Debug : GetMapping.EventLogEntryType = EventLogEntryType.Information
      Case Level.Info : GetMapping.EventLogEntryType = EventLogEntryType.Information
      Case Level.Warn : GetMapping.EventLogEntryType = EventLogEntryType.Warning
      Case Level.Error : GetMapping.EventLogEntryType = EventLogEntryType.Error
      Case Level.Fatal : GetMapping.EventLogEntryType = EventLogEntryType.Error
    End Select
  End Function



  Private Function GetLogLevel(Category As Categories) As Level
    Select Case Category
      Case Categories.Debug : LogLevel = Level.Debug
      Case Categories.Info : LogLevel = Level.Info
      Case Categories.Warn : LogLevel = Level.Warn
      Case Categories.Error : LogLevel = Level.Error
      Case Categories.Fatal : LogLevel = Level.Fatal
      Case Else : LogLevel = Level.All
    End Select
  End Function



  Private Enum Categories
    Debug = 3
    Info = 4
    Warn = 6
    [Error] = 7
    Fatal = 11
  End Enum
End Class
像这样使用它:

BasicConfigurator.Configure(EvAppender.Build(ApplicationName).ToArray)
Logger = LogManager.GetLogger(ApplicationName)