Log4net EventLogAppender日志事件ID

Mar*_*kus 11 log4net

有没有办法将事件记录到Windows事件日志中,并且每条消息都有指定的eventid?我正在使用log4net v 1.2.10.

Ste*_*gli 19

基于我在EventLogAppender源代码中看到的内容,以下应该可以解决这个问题:

log4net.ThreadContext.Properties ["EventID"] = 5;

只需在编写日志消息之前调用它(如果没有为所有消息设置它,则应从属性中再次删除"EventID".

注意,属性键区分大小写.


Mic*_*evy 6

当在System.Diagnostics中使用本机.net事件日志API时,WriteEntry方法允许设置eventID和类别.在这些API中:

  • eventID是32位int,但其值必须介于0到65535之间
  • category是16位int,但其值必须为正数.如果事件源包含类别资源文件,则事件查看器将使用整数类别值来查找本地化的"任务类别"字符串.否则,显示整数值.该类别必须顺序编号,以数字1开始

Log4net支持编写EventID和Category,但它不是直截了当的.当log4net的EventLogAppender记录一个事件时,它会查看一个属性字典.EventLogAppender将命名属性"EventID"和"Category"自动映射到事件日志中的相应值.我已经看到了一些很好的建议方法来使用log4net的EventLogAppender并在Windows事件日志中设置EventID和Category.

一个.使用log4net的appender过滤,可以注册一个可以添加EventID和Category属性的过滤器.此方法具有使用标准log4net包装器的好处,因此可以在不更改现有日志记录代码的情况下实现此方法.此方法的难点是必须创建一些机制来从记录的信息中计算EventID和Category.例如,过滤器可以查看异常源并将该源映射到Category值.

湾 可以扩展Log4net,因此可以使用包含EventID和Category参数的自定义日志记录包装器.添加EventID在log4net示例"Extensibility - EventIDLogApp"中进行了演示,该示例包含在log4net源中.在扩展示例中,使用了一个新接口(IEventIDLog),它扩展了应用程序用于记录的标准ILog接口.这提供了包含eventId参数的新日志记录方法.在记录事件之前,新的日志记录方法将eventId添加到Properties字典中.

public void Info(int eventId, object message, System.Exception t)
{
       if (this.IsInfoEnabled)
       {
             LoggingEvent loggingEvent = new LoggingEvent(ThisDeclaringType, Logger.Repository, Logger.Name, Level.Info, message, t);
             loggingEvent.Properties["EventID"] = eventId;
             Logger.Log(loggingEvent);
       }
}
Run Code Online (Sandbox Code Playgroud)

C.Log4net支持包含Properties字典的ThreadContext对象.应用程序可以在此字典中设置EventID和Category属性,然后当线程调用日志记录方法时,EventLogAppender将使用这些值.

log4net.ThreadContext.Properties["EventID"] = 5;
Run Code Online (Sandbox Code Playgroud)

一些有用的参考:


Mar*_*kus 5

好吧,解决方案是构建扩展项目"log4net.Ext.EventID"并使用它的类型:IEventIDLog,EventIDLogImpl和EventIDLogManager.