使用存储过程时log4net问题

时间:2016-04-21 13:54:50

标签: sql-server stored-procedures logging log4net

我正在尝试使用存储过程进行日志记录。我创建了一个存储过程,它将一行插入表

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;,这是未提供的。

我有什么遗失的吗?

2 个答案:

答案 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>

将格式替换为您想要使用的格式。