-
Notifications
You must be signed in to change notification settings - Fork 99
/
Copy pathSampleCustomFormatter.cs
108 lines (90 loc) · 3.97 KB
/
SampleCustomFormatter.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using Microsoft.Extensions.Logging;
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Unicode;
using System.Threading.Tasks;
using ZLogger;
namespace ConsoleApp;
// CLEF MessageTemplate Formatter https://clef-json.org/
internal class CLEFMessageTemplateFormatter : IZLoggerFormatter
{
static readonly JsonEncodedText Timestamp = JsonEncodedText.Encode("@t");
static readonly JsonEncodedText Message = JsonEncodedText.Encode("@m");
static readonly JsonEncodedText MessageTemplate = JsonEncodedText.Encode("@mt");
static readonly JsonEncodedText Level = JsonEncodedText.Encode("@l");
static readonly JsonEncodedText Exception = JsonEncodedText.Encode("@x");
static readonly JsonEncodedText EventId = JsonEncodedText.Encode("@i");
static readonly JsonEncodedText Renderings = JsonEncodedText.Encode("@r");
static readonly JsonEncodedText LogLevelVerbose = JsonEncodedText.Encode("Verbose");
static readonly JsonEncodedText LogLevelDebug = JsonEncodedText.Encode("Debug");
static readonly JsonEncodedText LogLevelInformation = JsonEncodedText.Encode("Information");
static readonly JsonEncodedText LogLevelWarning = JsonEncodedText.Encode("Warning");
static readonly JsonEncodedText LogLevelError = JsonEncodedText.Encode("Error");
static readonly JsonEncodedText LogLevelFatal = JsonEncodedText.Encode("Fatal");
public JsonSerializerOptions JsonSerializerOptions { get; set; } = new()
{
WriteIndented = false,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};
public bool WithLineBreak => true;
Utf8JsonWriter? jsonWriter;
ArrayBufferWriter<byte> originalFormatWriter = new ArrayBufferWriter<byte>();
public void FormatLogEntry(IBufferWriter<byte> writer, IZLoggerEntry entry)
{
// FormatLogEntry is guaranteed call in single-thread so reuse Utf8JsonWriter
jsonWriter?.Reset(writer);
jsonWriter ??= new Utf8JsonWriter(writer);
jsonWriter.WriteStartObject();
jsonWriter.WriteString(Timestamp, entry.LogInfo.Timestamp.Utc); // Utc or Local
WriteLogLevel(jsonWriter, entry.LogInfo.LogLevel);
// choose string Name or int Id
jsonWriter.WriteString(EventId, entry.LogInfo.EventId.Name);
// jsonWriter.WriteNumber(EventId, entry.LogInfo.EventId.Id);
// MessageTemplate
originalFormatWriter.ResetWrittenCount();
entry.WriteOriginalFormat(originalFormatWriter);
jsonWriter.WriteString(MessageTemplate, originalFormatWriter.WrittenSpan);
if (entry.LogInfo.Exception != null)
{
jsonWriter.WriteString(Exception, entry.LogInfo.Exception.ToString());
}
// Parameters
entry.WriteJsonParameterKeyValues(jsonWriter, JsonSerializerOptions);
jsonWriter.WriteEndObject();
jsonWriter.Flush();
}
static void WriteLogLevel(Utf8JsonWriter writer, LogLevel logLevel)
{
// Mapping SeriLog(CLEF author)'s LogLevel
switch (logLevel)
{
case LogLevel.Trace:
writer.WriteString(Level, LogLevelVerbose);
break;
case LogLevel.Debug:
writer.WriteString(Level, LogLevelDebug);
break;
case LogLevel.Information:
// Ignore LogLevel.Information(it is default for compact format)
break;
case LogLevel.Warning:
writer.WriteString(Level, LogLevelWarning);
break;
case LogLevel.Error:
writer.WriteString(Level, LogLevelError);
break;
case LogLevel.Critical:
writer.WriteString(Level, LogLevelFatal);
break;
default:
break;
}
}
}