【问题标题】:(EventLogAppender) Can we set the event category at runtime, without recreating the appender?(EventLogAppender) 我们可以在运行时设置事件类别,而不重新创建appender吗?
【发布时间】:2015-09-17 10:01:35
【问题描述】:

这是一个基类,所以我完全在运行时配置 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

在构建 appender 时设置事件类别很容易,但我希望类别与日志级别相对应。

有没有办法做到这一点,而不必在调用记录器时为每个日志级别构建一个特殊的附加程序?这肯定会成为性能杀手。

看起来不像,但我可能是错的。我以前也遇到过一次。

【问题讨论】:

    标签: log4net log4net-appender


    【解决方案1】:

    好的,知道了。感谢Stafford 提供解决方案...为每个类别添加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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 2017-12-01
      • 2017-07-05
      相关资源
      最近更新 更多