Mit uniqueidentifiers / guids als benutzerdefinierte Eigenschaften in log4net
-
05-07-2019 - |
Frage
Ich versuche, eine benutzerdefinierte Eigenschaft hinzufügen, die eine GUID ist, aber es gibt mir diese Fehlermeldung:
System.InvalidCastException: Fehler beim Parameterwert aus einem String konvertieren zu einem Guid. ---> System.InvalidCastException: Ungültige Umwandlung von ‚System.String‘ zu 'System.Guid'.
ich geben Sie dies in der config:
<parameter>
<parameterName value="@id" />
<dbType value="Guid" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%X{id}" />
</layout>
</parameter>
Der eigentliche Code (Snippet) i verwenden, ist dies:
Guid guid = Guid.NewGuid();
if (defaultLogger.IsEnabledFor(level))
{
var loggingEvent = new LoggingEvent(ThisDeclaringType,
defaultLogger.Repository, defaultLogger.Name, level, message, exception);
loggingEvent.Properties["Id"] = guid;
Jede Hilfe bitte? :) Das ID-Feld in der Datenbank als ein Unique NOT NULL definiert ist, aber es hat nicht den Primärschlüssel contraint.
Lösung
Für Ihr Beispiel soll die folgenden Arbeiten:
<parameter>
<parameterName value="@Oid" />
<dbType value="Guid" />
<layout type="log4net.Layout.RawPropertyLayout">
<key value="Id" />
</layout>
</parameter>
Wichtig ist, dass Sie @id etwas umbenennen sonst sonst werden Sie sogar Null-Werte in der Datenbank erhalten, wenn Sie versuchen, Zeichenketten einzufügen,
Und dann RawPropertyLayout verwenden zu speichern, cus Sie convertion nicht tun müssen.
Andere Tipps
1. Laden Sie den Quellcode von log4.net
2 Ändern Sie die Funktion FormatValue
in der Datei log4net.Appender.AdoNetAppender.cs
wie folgt aus:.
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;
}
}
dann funktioniert es!
Wenn Sie eine Allzweck- GUID Eigenschaft erhalten möchten, können Sie wie folgt vor:
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();
}
und dann können Sie die Eigenschaft auf folgende Weise aufrufen:
<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>
Sie können auch diese Art von Layout für einen benutzerdefinierten DB-Parameter verwenden, wie es hier beschrieben wird.