Chr*_*rts 24 asp.net logging log4net
我是log4net的新手,所以希望对某人来说这是一个非常简单的问题?!
我的log4net使用了RollingLogFileAppender来处理我的Web应用程序.我正在使用日志记录来尝试查找某些性能问题的来源.为了做到这一点,在日志输出中包含ASP.NET SessionID是有用的,这样我就可以确保我正在查看特定用户的日志条目.
有什么方法可以通过conversionPattern设置appender 来做到这一点吗?%property{??}我有可以使用的设置吗?
更新:这个问题仍未得到解答 - 有没有人有任何想法?
Dan*_*ner 20
Alexander K.几乎是正确的.唯一的问题是该PostAcquireRequestState事件也发生在静态请求中.在这种情况下调用Session会导致a HttpException.
因此正确的解决方案变为:
protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
if (Context.Handler is IRequiresSessionState)
{
log4net.ThreadContext.Properties["SessionId"] = Session.SessionID;
}
}
Run Code Online (Sandbox Code Playgroud)
Ale*_* K. 15
更新(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;
}
Run Code Online (Sandbox Code Playgroud)
并将[%property {SessionID}]添加到conversionPattern.
如果我错了,有人会纠正我,但是一个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;
}
Run Code Online (Sandbox Code Playgroud)
之后,您可以像这样设置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>
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
你可以试试:
<conversionPattern
value="%date %-5level %logger ${COMPUTERNAME} [%property{SessionID}] - %message%newline" />
Run Code Online (Sandbox Code Playgroud)
...在您的 Web.config 和 Global.asax.cs 中:
protected void Session_Start(object sender, EventArgs e)
{
log4net.ThreadContext.Properties["SessionID"] = Session.SessionID;
log4net.Config.XmlConfigurator.Configure();
}
Run Code Online (Sandbox Code Playgroud)