我有adonet appender,我定义了额外的列。我想从asp.net会话中获取userId并进行记录。
根据this page,我使用%aspnet-session {key}模式:
<parameter>
<parameterName value="@userId" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%aspnet-session{current_member}" />
</layout>
</parameter>
我在数据库中得到以下结果:
/ LM / W3SVC / 1 / ROOT /干线1-129718741958458380spnet会话{current_member}
我在这里做错了什么?
答案 0 :(得分:4)
从log4net 1.2.11.0开始,您可以使用ASP.NET pattern layout转换器的%aspnet-request {ASP.NET_SessionId} ,如下所示:
<conversionPattern value="%date %level %logger [%aspnet-request{ASP.NET_SessionId}] - %message%newline" />
请参阅release notes:
答案 1 :(得分:2)
/ LM / W3SVC / 1 / ROOT /干线1-129718741958458380spnet会话{current_member} 正在记录,因为在你的log4net定义中你有这样的东西吗?
<parameter>
<parameterName value="@user" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%aspnet-session{current_memeber}" />
</layout>
</parameter>
并且log4net从“%aspnet-session {current_memeber}”中取出“%a”并认为您想要应用程序域。 %a是转换为应用程序域的log4net模式。这真的很烦人,我最近碰到了这个并且不知道解决方法。
见这里: https://logging.apache.org/log4net/log4net-1.2.13/release/sdk/log4net.Layout.PatternLayout.html
找到解决此问题的方法。如果您使用log4net 1.2.11或更高版本,则声明您的参数应该可以正常工作。
<parameter>
<parameterName value="@session" />
<dbType value="String" />
<size value="2147483647"/>
<layout type="log4net.Layout.PatternLayout">
<converter>
<name value ="AspNetSessionPatternConverter"/>
<type value="log4net.Layout.Pattern.AspNetSessionPatternConverter"/>
</converter>
<conversionPattern value="%aspnet-session{gwsession}" />
</layout>
</parameter>
我不知道%a是否被短路到appdomain是一个错误,或者你是否应该用aspnetsessionpatternconverter声明这样的params,但如果更新了log4net文档会很好。希望这有助于其他人。
答案 2 :(得分:0)
我找到了解决问题的方法。
我只是重构它以满足我的需求:
public class Log4NetAspNetProperty
{
private const string PropertyNamePrefix = "log4net_app_";
private const string PropertyDefaultValue = null;
private readonly string propertyName;
private readonly object propertyValue;
public string Name { get { return propertyName; } }
private Log4NetAspNetProperty(string propertyName, object propertyValue)
{
if (String.IsNullOrWhiteSpace(propertyName)) throw new ArgumentNullException("propertyName");
this.propertyName = propertyName;
this.propertyValue = propertyValue;
if (HttpContext.Current != null)
HttpContext.Current.Items[GetPrefixedPropertyName()] = propertyValue;
}
public override string ToString()
{
if (HttpContext.Current == null)
return PropertyDefaultValue;
var item = HttpContext.Current.Items[GetPrefixedPropertyName()];
return item != null ? item.ToString() : PropertyDefaultValue;
}
private static string GetPrefixedPropertyName()
{
return String.Format("{0}{1}", PropertyNamePrefix, PropertyDefaultValue);
}
public static void CurrentUserId(object userId)
{
var property = new Log4NetAspNetProperty("CurrentUserId", userId);
log4net.ThreadContext.Properties[property.Name] = property;
}
public static void CurrentUrl(object url)
{
var property = new Log4NetAspNetProperty("CurrentUrl", url);
log4net.ThreadContext.Properties[property.Name] = property;
}
}
答案 3 :(得分:0)
您需要使用log4net 1.2.11或更高版本才能访问ASP.NET模式转换器。
当您使用旧版本的log4net时,您将收到LM / W3SVC / 1 / ROOT / trunk-1-129718741958458380spnet-session {current_member}消息。