我可以使用ADONetAppender设置log4NET,当我想通过log.Info(消息)记录消息时捕获事物的状态时,一切正常。
由于我将根据在整个应用程序中更改的ActionID从我的应用程序中的各个位置进行日志记录,如何进行扩展以便我可以使用ActionID发出调用,例如log.Info(ActionID,message)最终进入数据库?
答案 0 :(得分:7)
您可以在调用GlobalContext.Properties
之前使用log.Info()
向log4net添加自定义字段,方法如下:
GlobalContext.Properties["ActionID"] = ActionID;
然后,在ADONetAppender配置中,您可以使用%property{ActionID}
访问此自定义字段。
答案 1 :(得分:4)
我认为@bcwood可能有最好/最简单的想法,只需使用GlobalContext.Properties来存储你想要记录的id。
但是,如果id对您非常重要,并且您想简化id的设置(例如通过向各种日志记录方法添加参数而不必添加单独的调用来设置id中的id) GlobalContext),然后您可以查看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");
答案 2 :(得分:0)
尝试通过包装info方法创建自定义函数。
void InfoLog(int ActionID, string message)
{
log.info(String.Format("{0}:{1}",ActionID.ToString(),message));
}