我可以使用 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()
通过执行以下操作将自定义字段添加到 log4net:
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.Info(123, "Hello");
logger.Info(321, "Good bye");
与@bcwood 的建议相比,这将使您的日志调用站点看起来像这样:
GlobalContext.Properties["ActionID"] = 123;
logger.Info("Hello");
GlobalContext.Properties["ActionID"] = 321;
logger.Info("Good bye");
尝试通过包装 info 方法来创建自定义函数。
void InfoLog(int ActionID, string message)
{
log.info(String.Format("{0}:{1}",ActionID.ToString(),message));
}