13
13
// limitations under the License.
14
14
15
15
using System ;
16
+ using System . Diagnostics ;
16
17
using System . Globalization ;
17
18
using System . IO ;
18
19
using Newtonsoft . Json ;
19
20
using Newtonsoft . Json . Linq ;
20
21
using Serilog . Events ;
21
22
using Serilog . Parsing ;
22
23
using System . Linq ;
24
+ // ReSharper disable MemberCanBePrivate.Global
25
+ // ReSharper disable UnusedMember.Global
23
26
24
27
namespace Serilog . Formatting . Compact . Reader
25
28
{
@@ -30,7 +33,7 @@ namespace Serilog.Formatting.Compact.Reader
30
33
public class LogEventReader : IDisposable
31
34
{
32
35
static readonly MessageTemplateParser Parser = new MessageTemplateParser ( ) ;
33
- static readonly Rendering [ ] NoRenderings = new Rendering [ 0 ] ;
36
+ static readonly Rendering [ ] NoRenderings = Array . Empty < Rendering > ( ) ;
34
37
readonly TextReader _text ;
35
38
readonly JsonSerializer _serializer ;
36
39
@@ -75,8 +78,7 @@ public bool TryRead(out LogEvent evt)
75
78
}
76
79
77
80
var data = _serializer . Deserialize ( new JsonTextReader ( new StringReader ( line ) ) ) ;
78
- var fields = data as JObject ;
79
- if ( fields == null )
81
+ if ( ! ( data is JObject fields ) )
80
82
throw new InvalidDataException ( $ "The data on line { _lineNumber } is not a complete JSON object.") ;
81
83
82
84
evt = ReadFromJObject ( _lineNumber , fields ) ;
@@ -93,7 +95,7 @@ public static LogEvent ReadFromString(string document, JsonSerializer serializer
93
95
{
94
96
if ( document == null ) throw new ArgumentNullException ( nameof ( document ) ) ;
95
97
96
- serializer = serializer ?? CreateSerializer ( ) ;
98
+ serializer ??= CreateSerializer ( ) ;
97
99
var jObject = serializer . Deserialize < JObject > ( new JsonTextReader ( new StringReader ( document ) ) ) ;
98
100
return ReadFromJObject ( jObject ) ;
99
101
@@ -123,22 +125,30 @@ static LogEvent ReadFromJObject(int lineNumber, JObject jObject)
123
125
messageTemplate = null ;
124
126
125
127
var level = LogEventLevel . Information ;
126
- if ( TryGetOptionalField ( lineNumber , jObject , ClefFields . Level , out string l ) )
128
+ if ( TryGetOptionalField ( lineNumber , jObject , ClefFields . Level , out var l ) )
127
129
level = ( LogEventLevel ) Enum . Parse ( typeof ( LogEventLevel ) , l , true ) ;
130
+
128
131
Exception exception = null ;
129
- if ( TryGetOptionalField ( lineNumber , jObject , ClefFields . Exception , out string ex ) )
132
+ if ( TryGetOptionalField ( lineNumber , jObject , ClefFields . Exception , out var ex ) )
130
133
exception = new TextException ( ex ) ;
131
134
135
+ ActivityTraceId traceId = default ;
136
+ if ( TryGetOptionalField ( lineNumber , jObject , ClefFields . TraceId , out var tr ) )
137
+ traceId = ActivityTraceId . CreateFromString ( tr . AsSpan ( ) ) ;
138
+
139
+ ActivitySpanId spanId = default ;
140
+ if ( TryGetOptionalField ( lineNumber , jObject , ClefFields . SpanId , out var sp ) )
141
+ spanId = ActivitySpanId . CreateFromString ( sp . AsSpan ( ) ) ;
142
+
132
143
var parsedTemplate = messageTemplate == null ?
133
144
new MessageTemplate ( Enumerable . Empty < MessageTemplateToken > ( ) ) :
134
145
Parser . Parse ( messageTemplate ) ;
135
146
136
147
var renderings = NoRenderings ;
137
148
138
- if ( jObject . TryGetValue ( ClefFields . Renderings , out JToken r ) )
149
+ if ( jObject . TryGetValue ( ClefFields . Renderings , out var r ) )
139
150
{
140
- var renderedByIndex = r as JArray ;
141
- if ( renderedByIndex == null )
151
+ if ( ! ( r is JArray renderedByIndex ) )
142
152
throw new InvalidDataException ( $ "The `{ ClefFields . Renderings } ` value on line { lineNumber } is not an array as expected.") ;
143
153
144
154
renderings = parsedTemplate . Tokens
@@ -164,13 +174,12 @@ static LogEvent ReadFromJObject(int lineNumber, JObject jObject)
164
174
properties . Add ( new LogEventProperty ( "@i" , new ScalarValue ( eventId ) ) ) ;
165
175
}
166
176
167
- return new LogEvent ( timestamp , level , exception , parsedTemplate , properties ) ;
177
+ return new LogEvent ( timestamp , level , exception , parsedTemplate , properties , traceId , spanId ) ;
168
178
}
169
179
170
180
static bool TryGetOptionalField ( int lineNumber , JObject data , string field , out string value )
171
181
{
172
- JToken token ;
173
- if ( ! data . TryGetValue ( field , out token ) || token . Type == JTokenType . Null )
182
+ if ( ! data . TryGetValue ( field , out var token ) || token . Type == JTokenType . Null )
174
183
{
175
184
value = null ;
176
185
return false ;
@@ -185,8 +194,7 @@ static bool TryGetOptionalField(int lineNumber, JObject data, string field, out
185
194
186
195
static bool TryGetOptionalEventId ( int lineNumber , JObject data , string field , out object eventId )
187
196
{
188
- JToken token ;
189
- if ( ! data . TryGetValue ( field , out token ) || token . Type == JTokenType . Null )
197
+ if ( ! data . TryGetValue ( field , out var token ) || token . Type == JTokenType . Null )
190
198
{
191
199
eventId = null ;
192
200
return false ;
@@ -208,17 +216,16 @@ static bool TryGetOptionalEventId(int lineNumber, JObject data, string field, ou
208
216
209
217
static DateTimeOffset GetRequiredTimestampField ( int lineNumber , JObject data , string field )
210
218
{
211
- JToken token ;
212
- if ( ! data . TryGetValue ( field , out token ) || token . Type == JTokenType . Null )
219
+ if ( ! data . TryGetValue ( field , out var token ) || token . Type == JTokenType . Null )
213
220
throw new InvalidDataException ( $ "The data on line { lineNumber } does not include the required `{ field } ` field.") ;
214
221
215
222
if ( token . Type == JTokenType . Date )
216
223
{
217
224
var dt = token . Value < JValue > ( ) . Value ;
218
- if ( dt is DateTimeOffset )
219
- return ( DateTimeOffset ) dt ;
225
+ if ( dt is DateTimeOffset offset )
226
+ return offset ;
220
227
221
- return ( DateTime ) dt ;
228
+ return ( DateTime ) dt ! ;
222
229
}
223
230
224
231
if ( token . Type != JTokenType . String )
0 commit comments