栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用log4net捕获用户名

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用log4net捕获用户名

如果HttpContext中可用的信息足够,也就是说,如果您发布的示例代码为您提供了正确的答案(MDC问题除外),而您只是不写:

HttpContext context = HttpContext.Current; if (context != null && context.User != null && context.User.Identity.IsAuthenticated){       MDC.Set("user", HttpContext.Current.User.Identity.Name); }

经常,那么您可以通过为log4net编写自己的自定义PatternLayoutConverter来将用户名“自动”添加到日志中。它们非常易于编写,您可以像内置的日志记录一样在log4net日志记录配置中对其进行配置。

有关如何编写自定义PatternLayoutConverter的一个示例,请参见此问题:

自定义log4net属性PatternLayoutConverter(带有索引)

使用该链接上的示例,您可能可以执行以下操作:

namespace Log4NetTest{  class HttpContextUserPatternConverter : PatternLayoutConverter  {    protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)    {      string name = "";      HttpContext context = HttpContext.Current;      if (context != null && context.User != null && context.User.Identity.IsAuthenticated)      {        name = context.User.Identity.Name;      }      writer.Write(name);    }  }}

您可以在log4net中对此进行配置,如下所示:

  //Log HttpContext.Current.User.Identity.Name  <layout type="log4net.Layout.PatternLayout">    <param name="ConversionPattern" value="%d [%t] %-5p [User = %HTTPUser] %m%n"/>    <converter>      <name value="HTTPUser" />      <type value="Log4NetTest.HttpContextUserPatternConverter" />    </converter>  </layout>

此外,您可以构建其他使用Option参数的模式转换器(请参阅上面的链接中的示例),以从HttpContext.Current.Items或HttpContext.Current.Session集合中提取特定项。

就像是:

namespace Log4NetTest{  class HttpContextSessionPatternConverter : PatternLayoutConverter  {    protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)    {      //Use the value in Option as a key into HttpContext.Current.Session      string setting = "";      HttpContext context = HttpContext.Current;      if (context != null)      {        object sessionItem;        sessionItem = context.Session[Option];        if (sessionItem != null)        {          setting = sessionItem.ToString();        }        writer.Write(setting);      }    }  }}namespace Log4NetTest{  class HttpContextItemPatternConverter : PatternLayoutConverter  {    protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)    {      //Use the value in Option as a key into HttpContext.Current.Session      string setting = "";      HttpContext context = HttpContext.Current;      if (context != null)      {        object item;        item = context.Items[Option];        if (item != null)        {          setting = item.ToString();        }        writer.Write(setting);      }    }  }}

您可能还会发现以下链接有用:

http://piers7.blogspot.com/2005/12/log4net-context-problems-with-
aspnet.html

在这里,博客作者提出了一种与我提出的方法不同的解决方案,用于从HttpContext记录值。阅读博客文章,查看他对问题的描述以及解决方案。为了总结解决方案,他将一个对象存储在GlobalDiagnosticContext(MDC的更现代名称)中。当log4net记录对象的值时,它使用ToString()。他的对象的实现从HttpContext检索一个值:

因此,您可以执行以下操作:

public class HttpContextUserNameProvider{  public override string ToString()  {    HttpContext context = HttpContext.Current;      if (context != null && context.User != null && context.User.Identity.IsAuthenticated)    {      return context.Identity.Name;    }    return "";  }}

您可以在程序的早期将这个对象的实例放在GlobalDiagnosticContext(MDC)中,由于它正在访问HttpContext.Current,因此它将始终返回正确的值。

MDC.Set("user", new HttpContextUserNameProvider());

这似乎比我建议的要容易得多!

为了完整起见,如果有人想知道如何在NLog中执行相同的操作,则NLog似乎可以通过其“ aspnet-*”
LayoutRenderers提供大多数/所有HttpContext信息:

https://github.com/nlog/nlog/wiki/Layout-
Renderers



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/568447.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号