Domanda

Sto provando ad aggiungere una proprietà personalizzata che è una guida, ma mi dà questo errore:

  

System.InvalidCastException: impossibile   converti il ??valore del parametro da una stringa   a un Guid. --- >   System.InvalidCastException: non valido   cast da "System.String" a   'System.Guid'.

Lo specifico nella configurazione:

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

Il codice effettivo (frammento) che uso è questo:

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

Qualche aiuto per favore? :) Il campo ID nel database è definito come unidentificatore univoco NOT NULL, ma non ha il contraint chiave primaria.

È stato utile?

Soluzione

Per il tuo esempio dovrebbe funzionare:

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

Importante è rinominare @id con qualcos'altro altrimenti si otterranno valori Null nel database anche se si tenta di inserire stringhe,

E quindi utilizzare RawPropertyLayout per archiviare, quindi non è necessario eseguire una conversione.

Altri suggerimenti

1. Scarica il codice sorgente di log4.net

2. Cambia la funzione FormatValue all'interno del file log4net.Appender.AdoNetAppender.cs in questo modo:

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;
            }
        }

allora funziona!

Se si desidera ottenere una proprietà GUID generica, è possibile effettuare le seguenti operazioni:

    private void ConfigureLog4Net()
    {
        // adds a global custom log4net property
        log4net.GlobalContext.Properties[nameof(Guid.NewGuid)] = new NewGuidWrapper();

        // configures log4net by XML configurations from a .config file
        log4net.Config.XmlConfigurator.Configure();
    }

    private class NewGuidWrapper
    {
        // will return new GUID every time it's called
        public override string ToString() => Guid.NewGuid().ToString();
    }

e quindi puoi chiamare la proprietà nel modo seguente:

<layout type="log4net.Layout.PatternLayout">
  <!-- if you want to format the layout as a GUID followed by a message  -->
  <conversionPattern value="%property{NewGuid} %m%n" />
</layout>

Puoi anche utilizzare questo tipo di layout per un parametro DB personalizzato come descritto qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top