这可能是不可能的,但我想知道是否有办法让它发挥作用。
我有一个大型 ASP.NET MVC43 应用程序,它已经使用日志记录语句进行了检测。
现在我们需要在每个日志条目中包含来自 Session 对象的“公司名称”值。是否可以配置 log4net 来读取 session 数据并将其包含在日志条目中?或者有什么方法可以强制它......?
感谢您的任何想法。
[编辑] 这个问题很有帮助:How can I include SessionID in log files using log4net in ASP.NET?
我最终将此作为我的解决方案:
在 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>
效果很好 - 我现在在日志输出中得到一个公司名称。谢谢大家的帮助。
最佳答案
使用自定义布局转换器
public class CompanyLayoutConverter : PatternLayoutConverter
{
protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
var httpContext = HttpContext.Current;
if (httpContext == null)
return;
writer.Write(httpContext.Session["Company Name"]);
}
}
将此转换器添加到附加布局,公司名称将出现在输出中(只需在 conversionPattern 值中使用 %company
):
<appender name="RollingLogFileAppender"
type="log4net.Appender.RollingFileAppender">
<threshold value="All" />
<file value="C:\LogFile" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'.'yyyyMMdd'.log.txt'" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<converter>
<name value="company"/>
<type value="Foo.Bar.CompanyLayoutConverter"/>
</converter>
<conversionPattern value="%date %-5level %logger - %company %message%newline" />
</layout>
</appender>
关于c# - 使用 log4net 在运行时读取并记录 HttpSession 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13691240/