forked from serilog-contrib/Serilog-Sinks-Discord
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSerilogWebhookObjectFactory.cs
113 lines (96 loc) · 3.94 KB
/
SerilogWebhookObjectFactory.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
109
110
111
112
113
using System;
using System.Collections.Generic;
using Discord.Webhook;
using Serilog.Events;
namespace Serilog.Sinks.Discord
{
public static class SerilogWebhookObjectFactory
{
public static WebhookObject Create(LogEvent logEvent, IFormatProvider formatProvider)
{
var obj = logEvent.Exception != null
? BuildExceptionObject(logEvent, formatProvider)
: BuildBasicObject(logEvent, formatProvider);
return obj;
}
private static WebhookObject BuildBasicObject(LogEvent logEvent, IFormatProvider formatProvider)
{
var message = logEvent.RenderMessage(formatProvider);
message = message?.Length > 1024 ? message.Substring(0, 1024) : message;
var obj = new WebhookObject();
obj.AddEmbed(builder =>
builder.WithTitle(GetLevelTitle(logEvent.Level))
.WithDescription(message)
.WithColor(GetColorFromLevel(logEvent.Level))
);
return obj;
}
private static WebhookObject BuildExceptionObject(LogEvent logEvent, IFormatProvider formatProvider)
{
var stackTrace = logEvent.Exception.StackTrace;
stackTrace = FormatStackTrace(stackTrace);
var obj = new WebhookObject();
obj.AddEmbed(builder =>
builder.WithTitle("Error")
.WithDescription(logEvent.Exception.Message)
.WithColor(GetColorFromLevel(logEvent.Level))
.WithThumbnail("https://raw.githubusercontent.com/javis86/Serilog.Sinks.Discord/master/Resources/error.png")
.AddField("Type", logEvent.Exception.GetType().Name, true)
.AddField("TimeStamp", logEvent.Timestamp.ToString(), true)
.AddField("Message", logEvent.Exception.Message)
.AddField("StackTrace", stackTrace)
.AddFieldsRange(GetFieldsFromLogEventProperties(logEvent.Properties))
);
return obj;
}
private static string FormatStackTrace(string stackTrace)
{
if (!string.IsNullOrEmpty(stackTrace)
&& stackTrace.Length >= 1024)
stackTrace = stackTrace.Substring(0, 1015) + "...";
stackTrace = $"```{stackTrace ?? "NA"}```";
return stackTrace;
}
private static DColor GetColorFromLevel(LogEventLevel level)
{
switch (level)
{
case LogEventLevel.Debug:
return Colors.Purple;
case LogEventLevel.Error:
return Colors.Red;
case LogEventLevel.Fatal:
return Colors.DarkRed;
case LogEventLevel.Information:
return Colors.Green;
case LogEventLevel.Verbose:
return Colors.Grey;
case LogEventLevel.Warning:
return Colors.Orange;
default:
return Colors.Black;
}
}
private static string GetLevelTitle(LogEventLevel level)
{
return level.ToString();
}
private static IEnumerable<Field> GetFieldsFromLogEventProperties(IReadOnlyDictionary<string, LogEventPropertyValue> logEventProperties)
{
var properties = new List<Field>();
foreach (var property in logEventProperties)
{
var value = property.Value.ToString().Length < 1024
? property.Value.ToString()
: property.Value.ToString().Substring(0, 1020) + "...";
properties.Add(new Field()
{
name = property.Key,
value = value,
inline = true
});
}
return properties.ToArray();
}
}
}