log4net 无法将数据插入自定义列
log4net cant insert data to custom column
为基本 lognet 列编写数据库很好,但我添加了另一个名为 "clientIp" 的列并将数据设置为日志对象前的 Ilog 但它将与 Message 列相同的数据写入 ClintIp 列..这里是我的配置和文件和数据库截图:
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
...
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception],[ClientIp]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception, @clientip)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
...
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
<parameter>
<parameterName value="@clientip" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout" />
</parameter>
</appender>
和我的记录器 class:
public static class Logger
{
private static ILog log {get; set;}
static Logger()
{
log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}
public static void Error(object msg, string userip)
{
log4net.LogicalThreadContext.Properties["ClientIp"] = userip;
if (log.IsErrorEnabled)
{
log.Error(msg);
}
}
这里有什么问题?
已编辑:
很明显,它使用给定参数为消息和 clientip 编写 db:for exmp: log.Error('Your Ip is::1');我如何告诉 log4net 使用 log4net.LogicalThreadContext.Properties["ClientIp"] 作为 ClientIp 列,使用 log.error(message) 作为 Message 列
你的代码不正确,应该是:
public static void Error(object msg, string userip)
{
log4net.LogicalThreadContext.Properties["ClientIp"] = userip;
if (log.IsErrorEnabled)
{
log.Error(msg); //<----Here is your error
}
}
并在ip栏中添加:
<parameter>
<parameterName value="@clientip" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout" >
<conversionPattern value="%property{ClientIp}" />
</layout>
</parameter>
如果这对其他人有帮助,我遇到了同样的问题:我添加的列中的数据是 "somewhat" 从消息列重复的。
例如,我只是将 "accessed home page" 记录为消息。我添加的列中显示了 "accessed home pageac"。
我的第一个错误是在布局类型之后有一个值属性:
从上面删除值属性防止数据在添加的列中重复,但现在该列为空。
我的第二个错误是,出于某种未知原因,log4net 不喜欢 'machinename'。我不知道问题是列名还是参数名,但我将 'machinename' 的所有实例更改为 'server' (当然包括重命名数据库中的列),这一切开始工作了。
编辑
好的,所以我想我刚刚意识到问题是 Properties 值区分大小写,所以我使用的是 .Properites["MachineName"] 但本应使用 .Properties["machinename"] .
为基本 lognet 列编写数据库很好,但我添加了另一个名为 "clientIp" 的列并将数据设置为日志对象前的 Ilog 但它将与 Message 列相同的数据写入 ClintIp 列..这里是我的配置和文件和数据库截图:
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
...
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception],[ClientIp]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception, @clientip)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
...
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
<parameter>
<parameterName value="@clientip" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout" />
</parameter>
</appender>
public static class Logger
{
private static ILog log {get; set;}
static Logger()
{
log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}
public static void Error(object msg, string userip)
{
log4net.LogicalThreadContext.Properties["ClientIp"] = userip;
if (log.IsErrorEnabled)
{
log.Error(msg);
}
}
这里有什么问题?
已编辑: 很明显,它使用给定参数为消息和 clientip 编写 db:for exmp: log.Error('Your Ip is::1');我如何告诉 log4net 使用 log4net.LogicalThreadContext.Properties["ClientIp"] 作为 ClientIp 列,使用 log.error(message) 作为 Message 列
你的代码不正确,应该是:
public static void Error(object msg, string userip)
{
log4net.LogicalThreadContext.Properties["ClientIp"] = userip;
if (log.IsErrorEnabled)
{
log.Error(msg); //<----Here is your error
}
}
并在ip栏中添加:
<parameter>
<parameterName value="@clientip" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout" >
<conversionPattern value="%property{ClientIp}" />
</layout>
</parameter>
如果这对其他人有帮助,我遇到了同样的问题:我添加的列中的数据是 "somewhat" 从消息列重复的。
例如,我只是将 "accessed home page" 记录为消息。我添加的列中显示了 "accessed home pageac"。
我的第一个错误是在布局类型之后有一个值属性:
从上面删除值属性防止数据在添加的列中重复,但现在该列为空。
我的第二个错误是,出于某种未知原因,log4net 不喜欢 'machinename'。我不知道问题是列名还是参数名,但我将 'machinename' 的所有实例更改为 'server' (当然包括重命名数据库中的列),这一切开始工作了。
编辑
好的,所以我想我刚刚意识到问题是 Properties 值区分大小写,所以我使用的是 .Properites["MachineName"] 但本应使用 .Properties["machinename"] .