使用存储过程时的 log4net 问题

log4net issue while using stored procedure

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

中插入一行
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:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Exception while writing to database
System.Data.SqlClient.SqlException (0x80131904): Procedure or function 'usp_insert_log' expects parameter '@log_date', which was not supplied.

有什么我遗漏的吗?

尝试删除 ConversionPattern 并只使用

 <layout type="log4net.Layout.RawTimeStampLayout"/>

不需要日期转换 - 请参阅 Log4net Conversion patterns

它将日期时间转换为字符串 - Iso8601DateFormatter Class

这开始是对 Peter 的回答的评论(我同意这是正确的答案),但评论不断增加,所以我决定在这里添加一个补充答案。

文档当然很难找到解决这个问题的方法,但此外,原始布局对象实现 IRawLayout 被引用 here 以使用原始的、未格式化的对象而不是格式化的对象,这在这种情况下 LoggingEvent.

上的原始 DateTime

如果您想提供格式化的 DateTime,您可以使用:

<layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{HH:mm:ss,fff}" />
</layout>

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