private void AddProperties(
            object logSource
            , Exception exception
            , LoggingEvent loggingEvent
            )
        {
            loggingEvent.Properties["UserName"] = GetUserName();

            try
            {
                var contextProperties = _contextService.GetContextProperties();

                if (contextProperties != null)
                {
                    try
                    {
                        loggingEvent.Properties["UserAgent"]  = contextProperties.UserAgent;
                        loggingEvent.Properties["RemoteHost"] = contextProperties.RemoteHost;
                        loggingEvent.Properties["Path"]       = contextProperties.Path;
                        loggingEvent.Properties["Query"]      = contextProperties.Query;
                        loggingEvent.Properties["RefererUrl"] = contextProperties.Referrer;
                        loggingEvent.Properties["RequestId"]  = contextProperties.RequestId;
                        loggingEvent.Properties["SessionId"]  = contextProperties.SessionId;
                    }
                    catch (Exception exc)
                    {
                        var type = typeof(Log4NetLoggingService);
                        _logManager = LogManager.GetLogger(type);
                        _logManager.Logger.Log(type, Level.Fatal,
                                               "Exception when extracting properties: " + exc.Message,
                                               exc);
                    }
                }

                loggingEvent.Properties["ExceptionType"]       = exception == null ? "" : exception.GetType().ToString();
                loggingEvent.Properties["ExceptionMessage"]    = exception == null ? "" : exception.Message;
                loggingEvent.Properties["ExceptionStackTrace"] = exception == null ? "" : exception.StackTrace;

                if (exception?.InnerException != null)
                {
                    loggingEvent.Properties["InnerException.Message"]    = exception.InnerException.Message;
                    loggingEvent.Properties["InnerException.Source"]     = exception.InnerException.Source ?? "";
                    loggingEvent.Properties["InnerException.StackTrace"] = exception.InnerException.StackTrace ?? "";
                    loggingEvent.Properties["InnerException.TargetSite"] = exception.InnerException.TargetSite ==
                                                                           null
                        ? ""
                        : exception.InnerException.TargetSite.ToString();
                }

                loggingEvent.Properties["AssemblyQualifiedName"] = exception == null
                    ? ""
                    : exception.GetType().AssemblyQualifiedName;
                loggingEvent.Properties["Namespace"] = exception == null ? "" : exception.GetType().Namespace;

                if (logSource != null)
                {
                    loggingEvent.Properties["LogSource"] = logSource.GetType().ToString();
                }
            }
            catch (Exception ex)
            {
                var type = typeof(Log4NetLoggingService);
                _logManager = LogManager.GetLogger(type);
                _logManager.Logger.Log(type, Level.Fatal, "Exception when extracting properties: " + ex.Message, ex);
            }
        }