Log4NET,ADONetAppender和自定义字段

4

我可以使用ADONetAppender设置log4NET,当我通过log.Info(message)记录消息时,一切都正常。

由于我将从应用程序中的各个位置记录日志,基于随应用程序变化的ActionID,如何扩展功能,以便我可以发出类似log.Info(ActionID, message)的调用,并使ActionID最终出现在数据库中?


调用log.info(String.Format("{0}:{1}",ActionID,message))怎么样? - Sunny
3个回答

7
您可以通过以下方式将自定义字段添加到log4net中:GlobalContext.Properties在调用log.Info()之前,例如:
GlobalContext.Properties["ActionID"] = ActionID;

接下来,在您的ADONetAppender配置中,您可以使用%property{ActionID}访问此自定义字段。


4

我认为@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");

与@bcwood的建议相比,这将使您的日志记录调用站点看起来像这样:
GlobalContext.Properties["ActionID"] = 123;
logger.Info("Hello");
GlobalContext.Properties["ActionID"] = 321;
logger.Info("Good bye");

0
尝试通过包装info方法来创建自定义函数。
void InfoLog(int ActionID, string message)
{
   log.info(String.Format("{0}:{1}",ActionID.ToString(),message));
}

这会使ActionID参数对ADONetAppender可访问吗?最终,ActionID需要出现在它自己的数据库字段中。 - John Smith
不会,它只是将 actionid 附加到被记录的消息中。 - Sunny
我需要类似以下的东西:log.info(5,"我的信息"),将5存储在我的数据库的statusID字段中,将"我的信息"存储在数据库的message字段中。我已经让log.info(message)和相关信息跟踪工作正常运行,但我需要log.info(value,message)将值发布到数据库中。这在log4net中是否可行? - John Smith
1
请查看类似需求的网址:https://dev59.com/qGct5IYBdhLWcg3wXsXH - Sunny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接