【问题标题】:Use the ASP.NET request user for Log4net log entries对 Log4net 日志条目使用 ASP.NET 请求用户
【发布时间】:2009-06-02 07:46:11
【问题描述】:

我的 ASP.NET 站点正在使用集成身份验证,但模拟已关闭。我在 web.config 中的“conversionPattern”中添加了一个“%username”,以将用户名添加到每个日志记录条目。但是,这将使用应用程序池身份的用户名,而不是当前访问用户的名称。

关于如何最好地做到这一点的任何想法?我必须编写自定义附加程序吗?我不介意任何轻微的性能损失,因为这是一个小型 Intranet 站点。谢谢!

【问题讨论】:

    标签: asp.net log4net


    【解决方案1】:

    在最新版本的 log4net 中内置了 ASP.NET 模式转换器:

    %aspnet-request{REMOTE_ADDR} and %aspnet-request{AUTH_USER}
    

    https://stackoverflow.com/a/7788792/74585

    您还可以访问的内容

    • aspnet 缓存
    • aspnet 上下文
    • aspnet 会话

    https://logging.apache.org/log4net/log4net-1.2.13/release/sdk/log4net.Layout.PatternLayout.html

    【讨论】:

      【解决方案2】:

      您可能想要查看的另一种(更简单的)解决方案是使用ThreadContext 类(以前实现为MDCNDC 类)。在您记录第一条消息之前,您可以在 HttpModule(在请求到达您的页面之前)或其他任何地方拥有类似的内容:

      ThreadContext.Properties["user"] = username;
      

      然后在你的conversionPattern中包含以下内容:

      %property{user}
      

      【讨论】:

      • 谢谢!我已经按照您的建议创建了一个 HttpModule,并将那段代码添加到 PostAuthorizeRequest 事件中。
      • 我使用相同的代码记录用户名,但有一个问题:您可以在一个线程上使用当前用户初始化 log4net,然后尝试登录不同的线程。
      • 您是指任何其他线程还是您存储上下文属性的线程的子线程?在第一种情况下,您看不到用户名是有道理的,因为此属性是线程本地的。在第二种情况下,您应该显式设置子线程的上下文属性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 2018-03-03
      • 2011-08-09
      相关资源
      最近更新 更多