JudahGabriel / RavenDB.StructuredLog

An ASP.NET Core logger that utilizes RavenDB to store structured logs.
https://www.nuget.org/packages/RavenDB.StructuredLogger
MIT License
12 stars 6 forks source link

Get constant errors with "Self referencing loop detected ", details enclosed #5

Closed bobskigit closed 3 years ago

bobskigit commented 4 years ago

Error while saving logs:

Unable to write logs to Raven. Possibly disconnected. Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property 'Module' with type 'System.Reflection.RuntimeModule'. Path ''. at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer, Object value, JsonProperty property, JsonContract contract, JsonContainerContract containerContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeDictionary(JsonWriter writer, IDictionary values, JsonDictionaryContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty) at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType) at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType) at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value) at Raven.Client.Documents.Session.EntityToBlittable.ConvertEntityToBlittable(Object entity, DocumentInfo documentInfo) in C:\Builds\RavenDB-Stable-4.2\42046\src\Raven.Client\Documents\Session\EntityToBlittable.cs:line 46 at Raven.Client.Documents.Session.InMemoryDocumentSessionOperations.PrepareForEntitiesPuts(SaveChangesData result) in C:\Builds\RavenDB-Stable-4.2\42046\src\Raven.Client\Documents\Session\InMemoryDocumentSessionOperations.cs:line 993 at Raven.Client.Documents.Session.InMemoryDocumentSessionOperations.PrepareForSaveChanges() in C:\Builds\RavenDB-Stable-4.2\42046\src\Raven.Client\Documents\Session\InMemoryDocumentSessionOperations.cs:line 813 at Raven.Client.Documents.Session.Operations.BatchOperation.CreateRequest() in C:\Builds\RavenDB-Stable-4.2\42046\src\Raven.Client\Documents\Session\Operations\BatchOperation.cs:line 32 at Raven.Client.Documents.Session.DocumentSession.SaveChanges() in C:\Builds\RavenDB-Stable-4.2\42046\src\Raven.Client\Documents\Session\DocumentSession.cs:line 82 at Raven.StructuredLog.RavenStructuredLogger.WriteLogBatch(IList1 logs, IDocumentStore db, Boolean hasRetried) at Raven.StructuredLog.RavenStructuredLogger.TryWriteLogBatch(IList1 logs, IDocumentStore db)

JudahGabriel commented 4 years ago

Thanks for the error report. It's caused by you sending in a log that has a self referencing loop, e.g.

var foo = new Foo();
var bar = new Bar();

// Make them refer to each other
bar.foo = foo;
foo.Bar = new bar;

logger.LogInformation("here is a self-referencing {obj}", foo);

We'll fix this.

In the meantime, you can fix this in your project:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers().AddNewtonsoftJson(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
}
JudahGabriel commented 3 years ago

FYI, as of v6, you can now do this:

// Call this extension method *before* calling docStore.Initialize()
docStore.IgnoreSelfReferencingLoops();