Utilisation d'identificateurs uniques / guides comme propriétés personnalisées dans log4net

StackOverflow https://stackoverflow.com/questions/424018

  •  05-07-2019
  •  | 
  •  

Question

J'essaie d'ajouter une propriété personnalisée qui est un guid, mais cela me donne cette erreur:

  

System.InvalidCastException: Echec de   convertir la valeur du paramètre d'une chaîne   à un Guid. --- >   System.InvalidCastException: non valide   cast de 'System.String' à   'System.Guid'.

Je précise cela dans la configuration:

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

Le code actuel (extrait) que j'utilise est le suivant:

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

Toute aide s'il vous plaît? :) Le champ id de la base de données est défini comme identifiant unique unique NULL, mais ne contient pas la contrainte de la clé primaire.

Était-ce utile?

La solution

Pour votre exemple, les éléments suivants devraient fonctionner:

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

Il est important de renommer @id en quelque chose d'autre, sinon vous obtiendrez des valeurs Null dans la base de données, même si vous essayez d'insérer des chaînes,

Et utilisez ensuite RawPropertyLayout pour stocker, car vous n’avez pas besoin de convertir.

Autres conseils

1. Téléchargez le code source de log4.net

2. Modifiez la fonction FormatValue dans le fichier log4net.Appender.AdoNetAppender.cs comme suit:

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

alors ça marche!

Si vous souhaitez obtenir une propriété GUID à usage général, procédez comme suit:

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

et vous pouvez ensuite appeler la propriété de la manière suivante:

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

Vous pouvez également utiliser ce type de présentation pour un paramètre de base de données personnalisé tel qu'il est décrit ici .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top