我是log4net的新手,所以希望对某人来说这是一个非常简单的问题?!
我的log4net正在使用RollingLogFileAppender为我的Web应用程序。我正在使用日志记录来尝试查找某些性能问题的来源。为了做到这一点,在日志输出中包含ASP.NET SessionID是有用的,这样我就可以确保我正在查看特定用户的日志条目。
有什么办法可以通过appender的conversionPattern
设置来实现这个目的吗?我可以使用%property{??}
设置吗?
更新:此问题仍未得到解答 - 是否有任何想法?
答案 0 :(得分:20)
PostAcquireRequestState
事件。在这种情况下调用Session将导致HttpException
。
因此正确的解决方案变为:
protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
if (Context.Handler is IRequiresSessionState)
{
log4net.ThreadContext.Properties["SessionId"] = Session.SessionID;
}
}
答案 1 :(得分:14)
更新(2014-06-12):从log4net 1.2.11开始,您可以在转换模式中使用%aspnet-request{ASP.NET_SessionId}
来实现此目的。
参考文献: https://issues.apache.org/jira/browse/LOG4NET-87 http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html
您应该在Global.asax.cs中创建Application_PostAcquireRequestState处理程序(在每个请求中调用它):
protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
log4net.ThreadContext.Properties["SessionID"] = Session.SessionID;
}
并将[%property {SessionID}]添加到conversionPattern。
答案 2 :(得分:5)
如果我错了,有人会纠正我,但是一个ASP.NET线程可以处理多个会话,所以你不能使用Session_Start,因为它在会话启动时被调用一次。这意味着只要不同的用户访问该网站,您的log4net.ThreadContext就可能被新的用户信息覆盖。
您可以将以下代码放在Application_AcquireRequestState中,也可以创建HttpModule并在AcquireRequestState方法中执行此操作。当ASP.NET运行时准备好获取当前HTTP请求的会话状态时,将调用AcquireRequestState。如果您对获取用户名感兴趣,可以在AuthenticateRequest中执行该操作,这是在ASP.NET运行时准备好验证用户身份(以及在AcquireRequestState之前)时引发的。
private void AcquireRequestState(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
log4net.ThreadContext.Properties["SessionId"] = context.Session.SessionID;
}
之后,您可以像这样设置log4net.config(或web.config)。
<appender name="rollingFile"
type="log4net.Appender.RollingFileAppender,log4net" >
<param name="AppendToFile" value="false" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyy.MM.dd" />
<param name="StaticLogFileName" value="true" />
<param name="File" value="log.txt" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern"
value="%property{SessionId} %d [%t] %-5p %c - %m%n" />
</layout>
</appender>
希望这有帮助!
答案 3 :(得分:5)
我也在寻找答案,并发现%aspnet-request{ASP.NET_SessionId}
对我来说很好。
答案 4 :(得分:1)
您可以尝试:
<conversionPattern
value="%date %-5level %logger ${COMPUTERNAME} [%property{SessionID}] - %message%newline" />
...在您的Web.config和Global.asax.cs中:
protected void Session_Start(object sender, EventArgs e)
{
log4net.ThreadContext.Properties["SessionID"] = Session.SessionID;
log4net.Config.XmlConfigurator.Configure();
}