CSharp - 在运行时使用 log4net,C# 读取&日志HttpSession数据

  显示原文与译文双语对照的内容

这可能不可能,但我想知道是否有办法让它工作。

我有一个大型的ASP.NET MVC43应用程序,已经用日志语句进行了测试。

现在,我们需要在每个日志条目中包含会话对象的"公司名称"值。 是否可以配置log4net以读取会话数据并将它的包含在日志项中? 或者某种方法来迫使它。

感谢你的帮助。

[Edit] 这个问题帮助了很多人: 如何在 ASP.NET 中使用log4net在日志文件中包含 SessionID

我最终把这作为我的解决方案:

在 Global.asax. cs中:


//After the session is acquired, push the organization code into log4net's thread context, in case it has to log anything.


 protected void Application_PostAcquireRequestState(object sender, EventArgs e)


 {


 if (Context.Handler is IRequiresSessionState && Session!= null && Session[Constants.EMPLOYEE_DETAILS]!= null)


 log4net.ThreadContext.Properties["Company"] = ((EmployeeDetails)Session[Constants.EMPLOYEE_DETAILS]).Company;


 }



在log4net配置中:


 <parameter>


 <parameterName value="@Company"/>


 <dbType value="String"/>


 <size value="10"/>


 <layout type="log4net.Layout.PatternLayout">


 <conversionPattern value="%property{Company}"/>


 </layout>


 </parameter>



我现在在日志输出中获得了一个公司 NAME 。 感谢你的帮助,大家。

时间: 原作者:

有关如何实现这里问题的一些想法,请参见这里。

捕获带有 log4net的用户名

你应该能够在不实现自己的附加程序的情况下执行该操作。

下面是自定义 PatternLayoutConverter的一个示例,它从 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);


 }


 }


 }


}



另一个简单的想法是做这样的事情。 创建一个对象,该对象将检索你想要的会话参数并将该对象放在NamedRange中,然后在布局。 当log4net从cxf访问对象时,它将调用它的ToString方法来将值写入到日志中。


public class HttpContextSessionParametreProvider


{


 private string _name;


 private string _notSet;



 public HttpContextSessionParameterProvider(string name)


 {


 _name = name;


 _notSet = string.Format("{0} not set", _name);


 }



 public override string ToString()


 {


 HttpContext context = HttpContext.Current; 


 if (context!= null && context.Session!= null)


 {


 object item = context.Session[_name];


 if (item!= null)


 {


 return item.ToString();


 }


 }


 return _notSet;


 }


}



在你程序入口点附近的地方使用它:


MDC.Set("CompanyName", new HttpContextSessionParametreProvider("Company Name"));



( 我没有一个方便的例子来配置log4net来从cxf中拉一个参数,但是不应该很难找到) 。

编辑:

你可以将PatternLayout配置为如下所示:


 <layout type="log4net.Layout.PatternLayout">


 <conversionPattern value="[%thread]|[%property{CompanyName}]|%message%newline"/>


 </layout>



现在假设 HttpContext.Session["Company Name"] 设置为某些东西时,每当你记录消息时,将将值写入日志。

原作者:
...