Scoped variables of different types produces issues #184
Description
Does this issue relate to a new feature or an existing bug?
- Bug
- New Feature
What version of Serilog.Sinks.Elasticsearch is affected? Please list the related NuGet package.
6.3.0
What is the target framework and operating system? See target frameworks & net standard matrix.
- netCore 2.0
- netCore 1.0
- 4.7
- 4.6.x
- 4.5.x
Please describe the current behavior?
If I run code like this:
using(logger.BeginScope("My text"))
using(logger.BeginScope(new Dictionary<string, string>{ { "Property 1", "Value 1" } }
logger.LogInformation("Hi");
I will get an error. In ES, the series of scope values are simply added as an array, so ES will figure out some type to support it. In our case, we had a number of scopes that were Dictionary<string, string>
, so the Scope
property ended up being object
.
Then later, we had the string like the one above, and we got an error like this (string cannot be converted to Object
):
2018-07-25T11:19:40.7254631Z Failed to store event with template 'Getting {AssemblyName}' into Elasticsearch. Elasticsearch reports for index logstash-2018.07.25 the following: {"type":"mapper_parsing_exception","reason":"failed to parse [fields.Scope]","caused_by":{"type":"illegal_state_exception","reason":"Can't get text on a START_OBJECT at 1:392"}}
We found the issue as we in one place used the Dictionary<string, string>
and elsewhere used strings - so some logs would simply not be logged (and as these are scopes, it can be whole series of logs -- anything within the scope)..
The bug also goes the other way around. If the Scope value is initially some simple type like a string, ES will auto-map to a text
property, and then any log with a scope value that is a complex value will fail.
Please describe the expected behavior?
So. I know that using Dictionary<string, object>
will "work as expected", as it doesn't add to Scope
but adds the individual properties instead.
Could we either:
- Ignore Scopes when the scope value is not a simple value like a string.
- Treat
Dictionary<string, T>
specially, so theT
type is always handled (converted to string?)