我正在尝试使用存储过程进行日志记录。我创建了一个存储过程,它将一行插入表
CREATE PROCEDURE [dbo].[usp_insert_log]
(
@log_date datetime,
@log_level varchar(10),
@log_message nvarchar(max)
)
AS
BEGIN
INSERT INTO [dbo].[Log] ([log_date], [log_level], [log_message])
VALUES (@log_date, @log_level, @log_message)
END
在我的配置文件中
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionStringName value="AnalyticsLogging" />
<commandText value="usp_insert_log" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout">
<conversionPattern value="%date" />
</layout>
</parameter>
</appender>
我收到以下错误
log4net:错误[AdoNetAppender] ErrorCode:GenericFailure。写入数据库时出现例外情况 System.Data.SqlClient.SqlException(0x80131904):过程或函数&#39; usp_insert_log&#39;期望参数&#39; @ log_date&#39;,这是未提供的。
我有什么遗失的吗?
答案 0 :(得分:2)
尝试删除ConversionPattern,然后使用
<layout type="log4net.Layout.RawTimeStampLayout"/>
不需要转换日期 - 请参阅Log4net Conversion patterns
它将日期时间转换为字符串 - Iso8601DateFormatter Class
答案 1 :(得分:2)
这首先是对彼得答案的评论(我同意这是正确的答案),但评论不断增加,所以我决定在这里添加一个补充答案。
文档肯定很难找到,但另外,Raw Layout对象实现IRawLayout
引用here来使用原始的,未格式化的对象而不是格式化的对象,在这种情况下DateTime
上的原始LoggingEvent
。
如果您想提供格式化的DateTime
,可以使用:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{HH:mm:ss,fff}" />
</layout>
将格式替换为您想要使用的格式。