扩展 log4net - 向每个日志添加额外数据

Posted

技术标签:

【中文标题】扩展 log4net - 向每个日志添加额外数据【英文标题】:Extending log4net - Adding additional data to each log 【发布时间】:2011-07-18 13:44:24 【问题描述】:

我们正在使用 log4net 登录我们的应用程序。我们希望在每次通话时自动捕获某些信息。调用 log.Info 或 log.Warn 的代码应该正常调用它们,无需指定此信息。

我正在寻找一种方法来创建我们可以插入 log4net 的东西。 ILog 应用程序用于记录日志和附加程序之间的一些东西,以便我们可以以某种方式将此信息放入日志消息中。要么进入 ThreadContext,要么进入 LogEventInfo。

我们希望捕获的信息与 asp.net 相关;请求 url、用户代理等。还有一些来自我们想要包含的应用程序 .config 文件的信息(应用程序 ID)。

我想在普通的 ILog.Info 和 appender 之间切换,以便这些信息也自动包含在也使用 log4net(Nhibernate、NServiceBus 等)的 3rd 方库中。

对我想要的可扩展性有什么建议吗?

谢谢

【问题讨论】:

【参考方案1】:

您要查找的内容称为日志事件上下文。本教程解释了它的工作原理:

http://www.beefycode.com/post/Log4Net-Tutorial-pt-6-Log-Event-Context.aspx

特别是“计算的上下文值”一章会让您感兴趣。

更新:

我的想法是使用全局上下文。很容易看出这对于诸如应用程序 ID 之类的东西是如何工作的(实际上,您甚至不需要计算上下文对象)。请求 url 之类的动态信息可以这样完成:

public class RequestUrlContext

    public override string ToString()
    
        string url;
        // retrieve url from request
        return url;
    

该对象是全局对象,但该方法在处理请求的线程上调用,因此您可以获得正确的信息。我还建议您为每个“信息实体”创建一个类,以便您在日志目标中的输出具有很大的灵活性。

【讨论】:

我没有看到完整的答案。线程上下文上计算的上下文值会有所帮助,但是我不清楚何时设置这些属性应该发生在 asp.net 上下文中,因为每个请求都由线程池线程提供服务。我可以将代码放在一个 global.asax 事件预请求处理程序中,但我希望有一个解决方案能够在不依赖我们的开发人员记住这样做的情况下工作。

以上是关于扩展 log4net - 向每个日志添加额外数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 log4net 日志框架

以编程方式配置 log4net,但额外的日志记录到控制台

Log4Net之记录日志到数据库

log4net日志系统使用详解

如何使用 log4net 日志框架

基于log4net的日志组件扩展分装,实现自动记录交互日志 XYH.Log4Net.Extend