C# 如何使用Log4net将Guid插入数据库?

C# 如何使用Log4net将Guid插入数据库?,c#,log4net,C#,Log4net,这是我的log4net.config <?xml version="1.0" encoding="utf-8"?> <log4net> <root> <level value="ALL" /> </root> <logger name="RequestLogger"> <level value="INFO" /> <appender-

这是我的log4net.config

<?xml version="1.0" encoding="utf-8"?>
<log4net>
    <root>
        <level value="ALL" />
    </root>

    <logger name="RequestLogger">
        <level value="INFO" />
        <appender-ref ref="AdoNetAppenderForRequestLogs" />
    </logger>

    <appender name="AdoNetAppenderForRequestLogs" type="log4net.Appender.AdoNetAppender">
        <bufferSize value="1" />
        <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <connectionString value="" />
        <commandText value="INSERT INTO Log4net_Requests ([Guid], [Date], [Url], [Headers], Controller, Action, RouteData) VALUES (@guid, @log_date, @url, @headers, @controller, @action, @routeData)" />
        <parameter>
            <parameterName value="@guid" />
            <dbType value="Guid" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%property{RequestGuid}" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@log_date" />
            <dbType value="DateTime" />
            <layout type="log4net.Layout.RawTimeStampLayout" />
        </parameter>
        <parameter>
            <parameterName value="@url" />
            <dbType value="String" />
            <size value="2000" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%property{Url}" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@headers" />
            <dbType value="String" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%property{Headers}" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@controller" />
            <dbType value="String" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%property{Controller}" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@action" />
            <dbType value="String" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%property{Action}" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@routeData" />
            <dbType value="String" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%property{RouteData}" />
            </layout>
        </parameter>
    </appender>
</log4net>
当我尝试登录时,在log4net.txt日志文件中会出现此异常

System.InvalidCastException: Failed to convert parameter value from a String to a Guid. ---> System.InvalidCastException: Invalid cast from 'System.String' to 'System.Guid'.
   at System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider)
   at System.String.System.IConvertible.ToType(Type type, IFormatProvider provider)
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType, Boolean& coercedToDataFeed, Boolean& typeChanged, Boolean allowStreaming)
   --- End of inner exception stack trace ---
   at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType, Boolean& coercedToDataFeed, Boolean& typeChanged, Boolean allowStreaming)
   at System.Data.SqlClient.SqlParameter.GetCoercedValue()
   at System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc)
   at System.Data.SqlClient.SqlCommand.BuildParamList(TdsParser parser, SqlParameterCollection parameters, Boolean includeReturnValue)
   at System.Data.SqlClient.SqlCommand.BuildExecuteSql(CommandBehavior behavior, String commandText, SqlParameterCollection parameters, _SqlRPC& rpc)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran, LoggingEvent[] events)
   at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events)
如果删除guid,日志将存储在DB中,因此我知道除了guid部分之外,其他都是

我需要做什么来修复此问题?

尝试创建一个新对象并将其分配给RequestGuid属性:

GlobalContext.Properties["RequestGuid"] = new Guid(RequestLog.Id);
如所提供的MSDN链接所述,上述使用的建造商:

使用值初始化Guid结构的新实例 由指定的字符串表示

使用阵列而不是阵列布局:


@Martijn如果您尝试新的GuidRequestLog.Id.ToString,您会得到什么?
GlobalContext.Properties["RequestGuid"] = new Guid(RequestLog.Id);
<parameter>
    <parameterName value="@guid" />
    <dbType value="Guid" />
    <layout type="log4net.Layout.RawPropertyLayout">
        <key value="RequestGuid" />
    </layout>
</parameter>