1
1
using System ;
2
2
using System . Collections . Generic ;
3
3
using System . Linq ;
4
- using System . Text ;
5
4
using NLog . Config ;
5
+ using NLog . LayoutRenderers ;
6
6
using NLog . Layouts ;
7
7
8
8
namespace NLog . Extensions . Logging
@@ -17,12 +17,14 @@ public class MicrosoftConsoleJsonLayout : JsonLayout
17
17
{
18
18
private static readonly string [ ] EventIdMapper = Enumerable . Range ( 0 , 50 ) . Select ( id => id . ToString ( System . Globalization . CultureInfo . InvariantCulture ) ) . ToArray ( ) ;
19
19
20
+ private readonly SimpleLayout _timestampLayout = new SimpleLayout ( "${date:format=o:universalTime=true}" ) ;
21
+
20
22
/// <summary>
21
23
/// Initializes a new instance of the <see cref="MicrosoftConsoleJsonLayout" /> class.
22
24
/// </summary>
23
25
public MicrosoftConsoleJsonLayout ( )
24
26
{
25
- Attributes . Add ( new JsonAttribute ( "Timestamp" , new TimestampLayout ( ) ) ) ;
27
+ Attributes . Add ( new JsonAttribute ( "Timestamp" , _timestampLayout ) ) ;
26
28
Attributes . Add ( new JsonAttribute ( "EventId" , Layout . FromMethod ( evt => LookupEventId ( evt ) , LayoutRenderOptions . ThreadAgnostic ) ) { Encode = false } ) ;
27
29
Attributes . Add ( new JsonAttribute ( "LogLevel" , Layout . FromMethod ( evt => ConvertLogLevel ( evt . Level ) , LayoutRenderOptions . ThreadAgnostic ) ) ) ;
28
30
Attributes . Add ( new JsonAttribute ( "Category" , "${logger}" ) ) ;
@@ -77,7 +79,7 @@ public string TimestampFormat
77
79
get
78
80
{
79
81
var index = LookupNamedAttributeIndex ( "Timestamp" ) ;
80
- return index >= 0 ? ( Attributes [ index ] . Layout as TimestampLayout ) ? . TimestampFormat : null ;
82
+ return index >= 0 ? ( ( Attributes [ index ] . Layout as SimpleLayout ) ? . LayoutRenderers ? . FirstOrDefault ( ) as DateLayoutRenderer ) ? . Format : null ;
81
83
}
82
84
set
83
85
{
@@ -89,7 +91,9 @@ public string TimestampFormat
89
91
90
92
if ( ! string . IsNullOrEmpty ( value ) )
91
93
{
92
- Attributes . Insert ( 0 , new JsonAttribute ( "Timestamp" , new TimestampLayout ( ) { TimestampFormat = value } ) ) ;
94
+ var dateLayoutRenderer = _timestampLayout . LayoutRenderers . First ( ) as DateLayoutRenderer ;
95
+ dateLayoutRenderer . Format = value ;
96
+ Attributes . Insert ( 0 , new JsonAttribute ( "Timestamp" , _timestampLayout ) ) ;
93
97
}
94
98
}
95
99
}
@@ -152,86 +156,5 @@ private static string ConvertLogLevel(LogLevel logLevel)
152
156
else
153
157
return nameof ( Microsoft . Extensions . Logging . LogLevel . Critical ) ;
154
158
}
155
-
156
- [ ThreadAgnostic ]
157
- private sealed class TimestampLayout : Layout
158
- {
159
- public string TimestampFormat
160
- {
161
- get => _timestampFormat ;
162
- set
163
- {
164
- if ( "o" . Equals ( value ) )
165
- value = "O" ;
166
- _timestampFormat = value ;
167
- _timestampFormatString = string . IsNullOrEmpty ( value ) ? null : $ "{{0:{ value } }}";
168
- }
169
- }
170
- private string _timestampFormat ;
171
- private string _timestampFormatString ;
172
-
173
- public TimestampLayout ( )
174
- {
175
- TimestampFormat = "O" ; // Round-trip - ISO8601 - yyyy-MM-ddTHH:mm:ss.fffffffZ
176
- }
177
-
178
- protected override string GetFormattedMessage ( LogEventInfo logEvent )
179
- {
180
- return _timestampFormatString != null ? logEvent . TimeStamp . ToUniversalTime ( ) . ToString ( TimestampFormat , System . Globalization . CultureInfo . InvariantCulture ) : String . Empty ;
181
- }
182
-
183
- protected override void RenderFormattedMessage ( LogEventInfo logEvent , StringBuilder target )
184
- {
185
- var utcTimestamp = logEvent . TimeStamp . ToUniversalTime ( ) ;
186
- if ( "O" . Equals ( TimestampFormat ) )
187
- {
188
- // yyyy-MM-ddTHH:mm:ss.fffffffZ
189
- Append4DigitsZeroPadded ( target , utcTimestamp . Year ) ;
190
- target . Append ( '-' ) ;
191
- Append2DigitsZeroPadded ( target , utcTimestamp . Month ) ;
192
- target . Append ( '-' ) ;
193
- Append2DigitsZeroPadded ( target , utcTimestamp . Day ) ;
194
- target . Append ( 'T' ) ;
195
- Append2DigitsZeroPadded ( target , utcTimestamp . Hour ) ;
196
- target . Append ( ':' ) ;
197
- Append2DigitsZeroPadded ( target , utcTimestamp . Minute ) ;
198
- target . Append ( ':' ) ;
199
- Append2DigitsZeroPadded ( target , utcTimestamp . Second ) ;
200
- target . Append ( '.' ) ;
201
- var ticks = ( int ) ( utcTimestamp . Ticks % 10000000 ) ;
202
- Append7DigitsZeroPadded ( target , ticks ) ;
203
- target . Append ( 'Z' ) ;
204
- }
205
- else if ( _timestampFormatString != null )
206
- {
207
- target . AppendFormat ( System . Globalization . CultureInfo . InvariantCulture , _timestampFormatString , utcTimestamp ) ;
208
- }
209
- }
210
-
211
- internal static void Append2DigitsZeroPadded ( StringBuilder builder , int number )
212
- {
213
- builder . Append ( ( char ) ( ( number / 10 ) + '0' ) ) ;
214
- builder . Append ( ( char ) ( ( number % 10 ) + '0' ) ) ;
215
- }
216
-
217
- internal static void Append4DigitsZeroPadded ( StringBuilder builder , int number )
218
- {
219
- builder . Append ( ( char ) ( ( ( number / 1000 ) % 10 ) + '0' ) ) ;
220
- builder . Append ( ( char ) ( ( ( number / 100 ) % 10 ) + '0' ) ) ;
221
- builder . Append ( ( char ) ( ( ( number / 10 ) % 10 ) + '0' ) ) ;
222
- builder . Append ( ( char ) ( ( number % 10 ) + '0' ) ) ;
223
- }
224
-
225
- internal static void Append7DigitsZeroPadded ( StringBuilder builder , int number )
226
- {
227
- builder . Append ( ( char ) ( ( ( number / 1000000 ) % 10 ) + '0' ) ) ;
228
- builder . Append ( ( char ) ( ( ( number / 100000 ) % 10 ) + '0' ) ) ;
229
- builder . Append ( ( char ) ( ( ( number / 10000 ) % 10 ) + '0' ) ) ;
230
- builder . Append ( ( char ) ( ( ( number / 1000 ) % 10 ) + '0' ) ) ;
231
- builder . Append ( ( char ) ( ( ( number / 100 ) % 10 ) + '0' ) ) ;
232
- builder . Append ( ( char ) ( ( ( number / 10 ) % 10 ) + '0' ) ) ;
233
- builder . Append ( ( char ) ( ( number % 10 ) + '0' ) ) ;
234
- }
235
- }
236
159
}
237
160
}
0 commit comments