diff --git a/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestIdEnricher.cs b/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestIdEnricher.cs
new file mode 100644
index 0000000000..856b50bce5
--- /dev/null
+++ b/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestIdEnricher.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Web;
+using Serilog.Core;
+using Serilog.Events;
+
+namespace Umbraco.Core.Logging.Serilog.Enrichers
+{
+ ///
+ /// Enrich log events with a HttpRequestId GUID.
+ /// Original source - https://github.com/serilog-web/classic/blob/master/src/SerilogWeb.Classic/Classic/Enrichers/HttpRequestIdEnricher.cs
+ /// Nupkg: 'Serilog.Web.Classic' contains handlers & extra bits we do not want
+ ///
+ internal class HttpRequestIdEnricher : ILogEventEnricher
+ {
+ ///
+ /// The property name added to enriched log events.
+ ///
+ public const string HttpRequestIdPropertyName = "HttpRequestId";
+
+ static readonly string RequestIdItemName = typeof(HttpRequestIdEnricher).Name + "+RequestId";
+
+ ///
+ /// Enrich the log event with an id assigned to the currently-executing HTTP request, if any.
+ ///
+ /// The log event to enrich.
+ /// Factory for creating new properties to add to the event.
+ public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
+ {
+ if (logEvent == null) throw new ArgumentNullException("logEvent");
+
+ Guid requestId;
+ if (!TryGetCurrentHttpRequestId(out requestId))
+ return;
+
+ var requestIdProperty = new LogEventProperty(HttpRequestIdPropertyName, new ScalarValue(requestId));
+ logEvent.AddPropertyIfAbsent(requestIdProperty);
+ }
+
+ ///
+ /// Retrieve the id assigned to the currently-executing HTTP request, if any.
+ ///
+ /// The request id.
+ /// true if there is a request in progress; false otherwise.
+ public static bool TryGetCurrentHttpRequestId(out Guid requestId)
+ {
+ if (HttpContext.Current == null)
+ {
+ requestId = default(Guid);
+ return false;
+ }
+
+ var requestIdItem = HttpContext.Current.Items[RequestIdItemName];
+ if (requestIdItem == null)
+ HttpContext.Current.Items[RequestIdItemName] = requestId = Guid.NewGuid();
+ else
+ requestId = (Guid)requestIdItem;
+
+ return true;
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestNumberEnricher.cs b/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestNumberEnricher.cs
new file mode 100644
index 0000000000..48415cccbc
--- /dev/null
+++ b/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpRequestNumberEnricher.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Threading;
+using System.Web;
+using Serilog.Core;
+using Serilog.Events;
+
+namespace Umbraco.Core.Logging.Serilog.Enrichers
+{
+ ///
+ /// Enrich log events with a HttpRequestNumber unique within the current
+ /// logging session.
+ /// Original source - https://github.com/serilog-web/classic/blob/master/src/SerilogWeb.Classic/Classic/Enrichers/HttpRequestNumberEnricher.cs
+ /// Nupkg: 'Serilog.Web.Classic' contains handlers & extra bits we do not want
+ ///
+ internal class HttpRequestNumberEnricher : ILogEventEnricher
+ {
+ ///
+ /// The property name added to enriched log events.
+ ///
+ public const string HttpRequestNumberPropertyName = "HttpRequestNumber";
+
+ static int _lastRequestNumber;
+ static readonly string RequestNumberItemName = typeof(HttpRequestNumberEnricher).Name + "+RequestNumber";
+
+ ///
+ /// Enrich the log event with the number assigned to the currently-executing HTTP request, if any.
+ ///
+ /// The log event to enrich.
+ /// Factory for creating new properties to add to the event.
+ public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
+ {
+ if (logEvent == null) throw new ArgumentNullException("logEvent");
+
+ if (HttpContext.Current == null)
+ return;
+
+ int requestNumber;
+ var requestNumberItem = HttpContext.Current.Items[RequestNumberItemName];
+ if (requestNumberItem == null)
+ HttpContext.Current.Items[RequestNumberItemName] = requestNumber = Interlocked.Increment(ref _lastRequestNumber);
+ else
+ requestNumber = (int)requestNumberItem;
+
+ var requestNumberProperty = new LogEventProperty(HttpRequestNumberPropertyName, new ScalarValue(requestNumber));
+ logEvent.AddPropertyIfAbsent(requestNumberProperty);
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpSessionIdEnricher.cs b/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpSessionIdEnricher.cs
new file mode 100644
index 0000000000..d2fbfd4627
--- /dev/null
+++ b/src/Umbraco.Core/Logging/Serilog/Enrichers/HttpSessionIdEnricher.cs
@@ -0,0 +1,39 @@
+using Serilog.Core;
+using Serilog.Events;
+using System;
+using System.Web;
+
+namespace Umbraco.Core.Logging.Serilog.Enrichers
+{
+ ///
+ /// Enrich log events with the HttpSessionId property.
+ /// Original source - https://github.com/serilog-web/classic/blob/master/src/SerilogWeb.Classic/Classic/Enrichers/HttpSessionIdEnricher.cs
+ /// Nupkg: 'Serilog.Web.Classic' contains handlers & extra bits we do not want
+ ///
+ internal class HttpSessionIdEnricher : ILogEventEnricher
+ {
+ ///
+ /// The property name added to enriched log events.
+ ///
+ public const string HttpSessionIdPropertyName = "HttpSessionId";
+
+ ///
+ /// Enrich the log event with the current ASP.NET session id, if sessions are enabled.
+ /// The log event to enrich.
+ /// Factory for creating new properties to add to the event.
+ public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
+ {
+ if (logEvent == null) throw new ArgumentNullException("logEvent");
+
+ if (HttpContext.Current == null)
+ return;
+
+ if (HttpContext.Current.Session == null)
+ return;
+
+ var sessionId = HttpContext.Current.Session.SessionID;
+ var sessionIdProperty = new LogEventProperty(HttpSessionIdPropertyName, new ScalarValue(sessionId));
+ logEvent.AddPropertyIfAbsent(sessionIdProperty);
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index 4177cfbd99..b747b0960f 100644
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -328,6 +328,9 @@
+
+
+