Skip to content

Commit 050ddcb

Browse files
authored
Merge pull request #29 from nblumhardt/allow-empty-names
Handle empty property names
2 parents 613df79 + bd65ab6 commit 050ddcb

File tree

9 files changed

+62
-13
lines changed

9 files changed

+62
-13
lines changed

asset/icon.png

19.9 KB
Loading

global.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"sdk": {
3+
"version": "5.0.102"
4+
}
5+
}

serilog-formatting-compact-reader.sln

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "global", "global", "{70BA4A
1111
Build.ps1 = Build.ps1
1212
LICENSE = LICENSE
1313
README.md = README.md
14+
.gitattributes = .gitattributes
15+
.gitignore = .gitignore
16+
global.json = global.json
1417
EndProjectSection
1518
EndProject
1619
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "asset", "asset", "{71DD3779-3435-42D0-BA02-AEA04EE5B1E5}"

src/Serilog.Formatting.Compact.Reader/LogEventReader.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ namespace Serilog.Formatting.Compact.Reader
3030
public class LogEventReader : IDisposable
3131
{
3232
static readonly MessageTemplateParser Parser = new MessageTemplateParser();
33+
static readonly Rendering[] NoRenderings = new Rendering[0];
3334
readonly TextReader _text;
3435
readonly JsonSerializer _serializer;
3536

@@ -132,7 +133,7 @@ static LogEvent ReadFromJObject(int lineNumber, JObject jObject)
132133
new MessageTemplate(Enumerable.Empty<MessageTemplateToken>()) :
133134
Parser.Parse(messageTemplate);
134135

135-
var renderings = Enumerable.Empty<Rendering>();
136+
var renderings = NoRenderings;
136137

137138
if (jObject.TryGetValue(ClefFields.Renderings, out JToken r))
138139
{
@@ -153,13 +154,13 @@ static LogEvent ReadFromJObject(int lineNumber, JObject jObject)
153154
.Select(f =>
154155
{
155156
var name = ClefFields.Unescape(f.Name);
156-
var renderingsByFormat = renderings.Where(rd => rd.Name == name);
157+
var renderingsByFormat = renderings.Length != 0 ? renderings.Where(rd => rd.Name == name).ToArray() : NoRenderings;
157158
return PropertyFactory.CreateProperty(name, f.Value, renderingsByFormat);
158159
})
159160
.ToList();
160161

161-
string eventId;
162-
if (TryGetOptionalField(lineNumber, jObject, ClefFields.EventId, out eventId)) // TODO; should support numeric ids.
162+
// TODO: this should attempt to support numeric ids.
163+
if (TryGetOptionalField(lineNumber, jObject, ClefFields.EventId, out var eventId))
163164
{
164165
properties.Add(new LogEventProperty("@i", new ScalarValue(eventId)));
165166
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using System.Runtime.CompilerServices;
2+
3+
[assembly: InternalsVisibleTo("Serilog.Formatting.Compact.Reader.Tests, PublicKey=" +
4+
"0024000004800000940000000602000000240000525341310004000001000100fb8d13fd344a1c" +
5+
"6fe0fe83ef33c1080bf30690765bc6eb0df26ebfdf8f21670c64265b30db09f73a0dea5b3db4c9" +
6+
"d18dbf6d5a25af5ce9016f281014d79dc3b4201ac646c451830fc7e61a2dfd633d34c39f87b818" +
7+
"94191652df5ac63cc40c77f3542f702bda692e6e8a9158353df189007a49da0f3cfd55eb250066" +
8+
"b19485ec")]

src/Serilog.Formatting.Compact.Reader/PropertyFactory.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,25 @@ namespace Serilog.Formatting.Compact.Reader
2222
static class PropertyFactory
2323
{
2424
const string TypeTagPropertyName = "$type";
25+
const string InvalidPropertyNameSubstitute = "(unnamed)";
2526

26-
public static LogEventProperty CreateProperty(string name, JToken value, IEnumerable<Rendering> renderings)
27+
public static LogEventProperty CreateProperty(string name, JToken value, Rendering[] renderings)
2728
{
29+
// The format allows (does not disallow) empty/null property names, but Serilog cannot represent them.
30+
if (!LogEventProperty.IsValidName(name))
31+
name = InvalidPropertyNameSubstitute;
32+
2833
return new LogEventProperty(name, CreatePropertyValue(value, renderings));
2934
}
3035

31-
static LogEventPropertyValue CreatePropertyValue(JToken value, IEnumerable<Rendering> renderings)
36+
static LogEventPropertyValue CreatePropertyValue(JToken value, Rendering[] renderings)
3237
{
3338
if (value.Type == JTokenType.Null)
3439
return new ScalarValue(null);
3540

3641
if (value is JObject obj)
3742
{
38-
JToken tt;
39-
obj.TryGetValue(TypeTagPropertyName, out tt);
43+
obj.TryGetValue(TypeTagPropertyName, out var tt);
4044
return new StructureValue(
4145
obj.Properties().Where(kvp => kvp.Name != TypeTagPropertyName).Select(kvp => CreateProperty(kvp.Name, kvp.Value, null)),
4246
tt?.Value<string>());
@@ -49,7 +53,7 @@ static LogEventPropertyValue CreatePropertyValue(JToken value, IEnumerable<Rende
4953

5054
var raw = value.Value<JValue>().Value;
5155

52-
return renderings != null && renderings.Any() ?
56+
return renderings != null && renderings.Length != 0 ?
5357
new RenderableScalarValue(raw, renderings) :
5458
new ScalarValue(raw);
5559
}

src/Serilog.Formatting.Compact.Reader/Serilog.Formatting.Compact.Reader.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
<PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
1212
<PackageId>Serilog.Formatting.Compact.Reader</PackageId>
1313
<PackageTags>serilog;json</PackageTags>
14-
<PackageIconUrl>http://serilog.net/images/serilog-extension-nuget.png</PackageIconUrl>
14+
<PackageIcon>icon.png</PackageIcon>
15+
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
1516
<PackageProjectUrl>https://github.com/serilog/serilog-formatting-compact-reader</PackageProjectUrl>
16-
<PackageLicenseUrl>http://www.apache.org/licenses/LICENSE-2.0</PackageLicenseUrl>
1717
<RepositoryUrl>https://github.com/serilog/serilog-formatting-compact-reader</RepositoryUrl>
1818
<RepositoryType>git</RepositoryType>
1919
</PropertyGroup>
@@ -29,7 +29,7 @@
2929
</ItemGroup>
3030

3131
<ItemGroup>
32-
<Folder Include="Properties\" />
32+
<None Include="..\..\asset\icon.png" Pack="true" Visible="false" PackagePath="" />
3333
</ItemGroup>
3434

3535
</Project>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using Newtonsoft.Json.Linq;
2+
using Serilog.Events;
3+
using Xunit;
4+
5+
namespace Serilog.Formatting.Compact.Reader.Tests
6+
{
7+
public class PropertyFactoryTests
8+
{
9+
[Fact]
10+
public void PropertiesAreConstructed()
11+
{
12+
const string name = "Test";
13+
const string value = "Value";
14+
var p = PropertyFactory.CreateProperty(name, new JValue(value), null);
15+
Assert.Equal(p.Name, name);
16+
var s = Assert.IsType<ScalarValue>(p.Value);
17+
Assert.Equal(value, s.Value);
18+
}
19+
20+
[Fact]
21+
public void InvalidPropertyNamesAreSubstituted()
22+
{
23+
const string name = "";
24+
var p = PropertyFactory.CreateProperty(name, new JValue((object)null), null);
25+
Assert.NotEqual(p.Name, name);
26+
}
27+
}
28+
}

test/Serilog.Formatting.Compact.Reader.Tests/Serilog.Formatting.Compact.Reader.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net461;netcoreapp2.0;netcoreapp3.1</TargetFrameworks>
4+
<TargetFrameworks>net462;net5.0</TargetFrameworks>
55
<AssemblyName>Serilog.Formatting.Compact.Reader.Tests</AssemblyName>
66
<AssemblyOriginatorKeyFile>../../asset/Serilog.snk</AssemblyOriginatorKeyFile>
77
<SignAssembly>true</SignAssembly>

0 commit comments

Comments
 (0)