我可以使用ADONetAppender设置log4NET,当我通过log.Info(message)记录消息时,一切都正常。
由于我将从应用程序中的各个位置记录日志,基于随应用程序变化的ActionID,如何扩展功能,以便我可以发出类似log.Info(ActionID, message)的调用,并使ActionID最终出现在数据库中?
我可以使用ADONetAppender设置log4NET,当我通过log.Info(message)记录消息时,一切都正常。
由于我将从应用程序中的各个位置记录日志,基于随应用程序变化的ActionID,如何扩展功能,以便我可以发出类似log.Info(ActionID, message)的调用,并使ActionID最终出现在数据库中?
GlobalContext.Properties
在调用log.Info()
之前,例如:GlobalContext.Properties["ActionID"] = ActionID;
接下来,在您的ADONetAppender配置中,您可以使用%property{ActionID}
访问此自定义字段。
我认为@bcwood可能有最好/最简单的想法,即使用GlobalContext.Properties来存储您要记录的id。
但是,如果该id对您非常重要,并且您希望简化设置id(例如通过向各种日志记录方法添加参数而不必添加单独的调用以设置GlobalContext中的id值),那么您可以查看log4net存储库中的此文件夹。
http://svn.apache.org/viewvc/logging/log4net/trunk/extensions/net/1.0/log4net.Ext.EventID/cs/src/
这里提供了一个示例,展示如何扩展log4net记录器以添加“EventID”参数。
在我看来,这似乎相当复杂(子类化log4net记录器,创建自己的LogManager来分发您的记录器等)。
如果选择包装log4net并在内部使用log4net的记录器进行记录,则可能可以简化一些。
使用我上面链接到的方法(或类似但更简单的包装log4net的Logger的方法)的优点是,您的日志调用站点可以像您提出的那样。
logger.Info(123, "Hello");
logger.Info(321, "Good bye");
GlobalContext.Properties["ActionID"] = 123;
logger.Info("Hello");
GlobalContext.Properties["ActionID"] = 321;
logger.Info("Good bye");
void InfoLog(int ActionID, string message)
{
log.info(String.Format("{0}:{1}",ActionID.ToString(),message));
}