有没有办法将事件记录到Windows事件日志中,并且每条消息都有指定的eventid?我正在使用log4net v 1.2.10.
Ste*_*gli 19
基于我在EventLogAppender源代码中看到的内容,以下应该可以解决这个问题:
log4net.ThreadContext.Properties ["EventID"] = 5;
只需在编写日志消息之前调用它(如果没有为所有消息设置它,则应从属性中再次删除"EventID".
注意,属性键区分大小写.
当在System.Diagnostics中使用本机.net事件日志API时,WriteEntry方法允许设置eventID和类别.在这些API中:
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)
一些有用的参考:
好吧,解决方案是构建扩展项目"log4net.Ext.EventID"并使用它的类型:IEventIDLog,EventIDLogImpl和EventIDLogManager.