2009-01-08 49 views
7

我想添加自定义属性,它是一个GUID,但它给我这个错误:使用uniqueidentifiers /的GUID在log4net的自定义属性

System.InvalidCastException: Failed to convert parameter value from a String to a Guid. ---> System.InvalidCastException: Invalid cast from 'System.String' to 'System.Guid'.

我在config指定此:

<parameter> 
<parameterName value="@id" /> 
<dbType value="Guid" /> 
<layout type="log4net.Layout.PatternLayout"> 
<conversionPattern value="%X{id}" /> 
</layout> 
</parameter> 

的实际代码(段),我用的是这个:

 Guid guid = Guid.NewGuid(); 
     if (defaultLogger.IsEnabledFor(level)) 
     { 
      var loggingEvent = new LoggingEvent(ThisDeclaringType, 
defaultLogger.Repository, defaultLogger.Name, level, message, exception); 
      loggingEvent.Properties["Id"] = guid; 

任何帮助吗? :)数据库中的id字段被定义为uniqueidentifier NOT NULL,但它没有主键约束。

+0

为什么你想要一个GUID?这是否提供某种上下文? – 2009-01-08 13:02:04

回答

22

对于示例下面应该工作:

<parameter> 
<parameterName value="@Oid" /> 
<dbType value="Guid" /> 
<layout type="log4net.Layout.RawPropertyLayout"> 
<key value="Id" /> 
</layout> 
</parameter> 

重要的是,你命名@id到别的东西,否则即使你尝试插入字符串你会得到数据库Null值,

然后使用RawPropertyLayout存储,你不需要做转换。

+1

为了清晰起见,是LoggingEvent属性集合中要查找的值的名称。 – bluedot 2017-09-18 19:48:11

0

下载log4.net

的源代码

2.更改功能FormatValue文件log4net.Appender.AdoNetAppender.cs里面是这样的:

virtual public void FormatValue(IDbCommand command, LoggingEvent loggingEvent) 
     { 
      // Lookup the parameter 
      IDbDataParameter param = (IDbDataParameter)command.Parameters[m_parameterName]; 

      // Format the value 
      object formattedValue = Layout.Format(loggingEvent); 

      // If the value is null then convert to a DBNull 
      if (formattedValue == null) 
      { 
       formattedValue = DBNull.Value; 
      } 

      if (param.DbType == System.Data.DbType.Guid) 
      { 
       param.Value = new Guid(formattedValue.ToString()); 
      } 
      else 
      { 
       param.Value = formattedValue; 
      } 
     } 

然后它的作品!